1

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

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 代码)的情况下准确地分析代码?

谢谢。

4

3 回答 3

4

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

于 2013-03-03T01:05:46.283 回答
1

commons lang 中有 StopWatch 类,它使用 System.nanoTime,

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

org.apache.commons.lang.time.StopWatch

于 2013-03-03T01:08:26.063 回答
1

在测量性能时,请记住 JVM 可能会在优化过程中消除没有副作用的代码。

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

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

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

于 2013-03-03T11:33:06.763 回答