Java 8 DateTimeFormatter性能

Java 8 DateTimeFormatter performance

本问题已经有最佳答案,请猛点这里访问。

我有下面的代码,它在我的应用程序中主要是时间复杂度方面最昂贵的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Test {

    private static final DateTimeFormatter SQL_FORMATTER = DateTimeFormatter.ofPattern("MM/dd/yy HH:mm:ss");

    public static void main(String[] args) {

        Instant start = Instant.now();
        try {
            String parsedDate = parseISO8601UtcDateToSqlDateFormat("2000-01-01T00:00:00Z");
            System.out.println(parsedDate);
        } finally {
            long timeTaken = Duration.between(start, Instant.now()).toMillis();
            System.out.println("

Finished processing in:"
+timeTaken+" ms!
"
);
        }
    }

    public static String parseISO8601UtcDateToSqlDateFormat(String param) {

        TemporalAccessor accessor = DateTimeFormatter.ISO_INSTANT.parse(param);
        LocalDateTime dateTime = LocalDateTime.ofInstant(Instant.from(accessor), ZoneOffset.UTC);
        return dateTime.format(SQL_FORMATTER);

    }

}

日期时间格式至少需要16毫秒。

而我的完整应用程序,它可以在不到1毫秒的时间内完成许多复杂的处理。

P.S:问题与基准测试无关,我只是想了解JAVA 8的日期时间解析是否真的这么贵,还是我做错了什么。


您是否尝试过:

1
2
3
4
5
6
7
private static final DateTimeFormatter SQL_FORMATTER = DateTimeFormatter.ofPattern(SQLFormatConstants.JAVA_DATE_FORMAT);

private String parseISO8601UtcDateToSqlDateFormat(String param) {
    TemporalAccessor accessor = DateTimeFormatter.ISO_INSTANT.parse(param);
    LocalDateTime dateTime = LocalDateTime.ofInstant(Instant.from(accessor), ZoneOffset.UTC);
    return dateTime.format(SQL_FORMATTER);
}

新的Java 8时间API具有无状态和不变的格式化程序。自定义格式化程序应该编译一次并存储在常量中(如DateTimeFormatter.ISO_INSTANT)。