Joda-Time getMillisOfDay() 似乎比 java.util.Date 的 getTime() 毫秒值发展得更快



我刚刚开始使用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更好。好吧,我确定是这样,我只是用错了。但我看不出如何。任何建议非常感谢!

我既不会使用Date也不会使用LocalDateTime来测量短时间间隔。这在您的问题中的主要原因是,对象创建有相当大的开销(查看 LocalDateTime 源代码)。还要记住,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 millisecondsn", (end - init) * 1e-6); 
}

最新更新