繁体   English   中英

System.currentTimeMillis()的大不同

[英]Big difference on System.currentTimeMillis()

我正在使用这段代码来测试哪种方法更快:

public void test() {
  long start = System.currentTimeMillis();
  MyDate date = new MyDate();
  int max = 5000;

  for (int i = 0; i < max; i++) {
    Calendar.getInstance().getTimeInMillis(); // <--
  }

  System.out.println("Calendar instance delay: " + (System.currentTimeMillis() - start));
  start = System.currentTimeMillis();

  for (int i = 0; i < max; i++) {
    date.getMillis(); // <--
  }

  System.out.println("My date delay: " + (System.currentTimeMillis() - start));
}

因此,基本上,我正在尝试比较Calendar.getInstance().getTimeInMillis()MyDate.getMillis()之间的性能(MyDate是我创建的类)。

好吧,当我运行上面的代码时,输​​出为:

Calendar instance delay: 413
My date delay: 2

但是 ,当我颠倒顺序时(首先叫MyDate,然后在Calendar之后),我得到了:

My date delay: 247
Calendar instance delay: 119

我尝试使用System.nanoTime() ,但是发生了相同的事情:要测试的第一个代码是花费了更长时间的代码。

有人知道为什么会发生这种差异吗? 或者,是否有一种方法可以在不使用外部探查器应用程序(仅是纯Java代码)的情况下准确地探查代码?

谢谢。

要测试“小”代码的性能,您必须多次调用它。 否则,JIT,缓存和分支预测的效果会影响您的测试。 如果我打电话给您看您接听电话需要多长时间,那么如果我几秒钟前才打电话给您,我会得到一个截然不同的答案。

Common lang中有一个StopWatch类,它使用System.nanoTime,

http://commons.apache.org/lang/

org.apache.commons.lang.time.StopWatch

在评估性能时,请记住,作为优化的一部分,JVM可能会消除没有副作用的代码。

为避免这种情况,您可以执行以下操作:

for (int i = 0; i < max; i++) {
    long a = date.getMillis();
    if (a % 1000 == i) {
        System.out.print(a);
    }
}

要注意的另一件事是热点优化。 在测量之前,您应该“热身”代码。

暂无
暂无

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

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