我刚刚开始使用Joda-Time,我遇到了一些看起来很奇怪的东西。
当我睡眠1毫秒并在睡眠前后调用getMillisOfDay()时,Joda-Time告诉我已经过了119毫秒。使用java.util.Date(在睡眠之前和之后创建一个实例,并获取每个返回的getTime()值的差异)报告一个小得多的经过时间值(2毫秒)。这比实际睡眠时间长1毫秒,但我猜测创建Date的对象开销有影响,无论如何报告java.util.Date的经过时间远远少于Joda-Time报告的时间。 。)
这是我的小测试方法:
@Test(enabled = true)
public void testsleep() {
LocalDateTime now = new LocalDateTime();
System.out.println("jodatime before millisecs:" + now.getMillisOfDay());
Thread.sleep(1);
LocalDateTime now2 = new LocalDateTime();
System.out.println("jodatime after millisecs:" + now2.getMillisOfDay());
System.out.println("java.util.DATE before call:" + new Date().getTime());
Thread.sleep(1);
Date after = new Date();
System.out.println("java.util.DATE after call:" + after.getTime());
println "done"
}
输出:
jodatime before millisecs:76672505
jodatime after millisecs:76672624
java.util.DATE before call:1396671472633
java.util.DATE after call:1396671472635
分析:
jodatime after millisecs:76672624
jodatime before millisecs:76672505
----------------
119 millisecs elapsed according to joda time
java.util.DATE after call:1396671472635
java.util.DATE before call:1396671472633
----------------
2 millisecs elapsed according to java util Date
我认为Joda-Time比java.util.Date更好。嗯,我确定它是,而且我只是错了。但我不知道怎么做。任何建议都非常感谢!
答案 0 :(得分:4)
我不会同时使用Date
和LocalDateTime
来衡量较短的时间间隔。在您的问题中写的主要原因是,对象创建有相当大的开销(查看LocalDateTime source code)。还要记住,JVM需要一些时间来预热(让JVM优化启动并发挥其魔力)。
虽然您不应该像这样进行基准测试(有很多适用于Java的基准测试工具),但是一个好的低级替代方案是System.nanoTime()
。 StopWatch
类也可能派上用场(例如Guava,Commons Lang和Spring实现。
最后,请记住Thread.sleep本身就存在精确问题。
// Run several times to *warm up*
for (int i = 0; i < 100; i++) {
double init = System.nanoTime();
Thread.sleep(1);
long end = System.nanoTime();
System.out.printf("Elapsed time: %.2f milliseconds\n", (end - init) * 1e-6);
}