繁体   English   中英

Joda-Time getMillisOfDay()似乎比java.util.Date的getTime()毫秒值更快地前进。

[英]Joda-Time getMillisOfDay() seems to be advancing more rapidly than java.util.Date's getTime() milliseconds value

我刚刚开始使用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。 好吧,我确定是的,我只是在错误地使用它。 但我不知道如何。 任何建议,不胜感激!

我不会使用DateLocalDateTime来测量较短的时间间隔。 写下问题的主要原因是,对象创建有相当大的开销(请查看LocalDateTime源代码 )。 还请记住,JVM需要一些时间进行预热(让JVM优化开始并发挥其魔力)。

尽管您不应该像这样进行基准测试(有很多针对Java的良好基准测试工具),但System.nanoTime()是一个不错的底层选择。 StopWatch类也可能派上用场(例如GuavaCommons LangSpring实现)。

最后,请记住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); 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM