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

标签 java jodatime

我刚刚开始使用 Joda-Time我遇到了一些看起来很奇怪的事情。

当我 sleep 1 毫秒并在 sleep 前后调用 getMillisOfDay() 时,Joda-Time 告诉我已经过去了 119 毫秒。使用 java.util.Date (在 sleep 之前和之后创建一个实例,并获取每个实例返回的 getTime() 值的差值)报告更小的耗时值(2 毫秒)。这比 1 毫秒的实际 sleep 时间长,但我猜测创建 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 source code )。另请记住,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); 
}

关于java - Joda-Time getMillisOfDay() 似乎比 java.util.Date 的 getTime() 毫秒值前进得更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22876721/

相关文章:

java - 乔达日期时间 : Parse date with "CEST" in string

java - 从文本文件中读取两列并在 java 中对两列进行排序

java - 如何在android中创建web应用程序?

java - 正在解析HH :mm (with two digits minute) to LocalTime with JodaTime

java - 如何使用 Joda-Time 表达部分间隔?

java - JodaTime IllegalArgumentException 格式无效 "yyyy-MM-dd hh:mm:ss"

java - 如果上次修改日期超过特定时间,我如何告诉 Camel 只复制文件?

java - 构造函数的 JUnit 测试

java - Apache Derby 中的 REPLACE 函数

timezone - 在 Joda Time 中使用偏移时间时如何打印时区缩写?