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的秒表
)。