Java 8 DateTimeFormatter性能

Java 8 DateTimeFormatter性能,java,performance,java-8,date,Java,Performance,Java 8,Date,我有以下代码,这是我的应用程序中时间复杂度方面最昂贵的代码 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();

我有以下代码,这是我的应用程序中时间复杂度方面最昂贵的代码

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("\n\nFinished processing in: "+timeTaken+ " ms!\n"); 
        }
    }

    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);

    }

}
日期时间格式设置至少需要16ms

而我的完整应用程序需要进行大量复杂的处理,只需不到1毫秒的时间即可完成

附言:这个问题与基准测试无关,我只是想了解使用java 8进行日期时间解析是否真的如此昂贵,还是我做错了什么。

您是否尝试过:

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);
}

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

您如何对此进行基准测试?
DateTimeFormatter formatter=DateTimeFormatter.ofPattern(SQLFormatConstants.JAVA\u DATE\u格式)我相信这可以是
静态最终版
。新的Java8DateTime api编译了这样的模式,每次你想格式化一个日期时,你都在编译一个模式。你的基准可能没有给出正确的结果。在我自己使用JMH进行的基准测试中,每次调用平均得到1ns(不是ms),这是完全可以忽略的。“问题与基准测试无关,我只是想了解使用java 8进行日期时间解析是否真的如此昂贵,还是我做错了什么。”->您做错了什么,您的度量是错误的。我想象你在测量类加载。“看看我在哪里记下了开始时间。我相信所有类加载都在那个时候完成了。”-你怎么会相信?评测/JIT怎么样?您正在对JVM进行基准测试,而不是对代码进行基准测试——听每个人都在告诉您什么。您所做的基准测试毫无意义。您是否考虑过格式化程序可能有延迟初始化?您是否考虑过JVM需要预热?您需要在不记录任何时间戳的情况下进行至少10k次迭代。然后用一个时间戳进行10k迭代。在10k迭代中分割时间范围。如果它仍然通过迭代为您提供16ms,那么我们将继续搜索解决方案。此外,使用
System.nanoTime()
进行基准测试(或使用Guava的
秒表
)。