8
class testx
{
  public testx()
  {
    long startTime = System.nanoTime();
    System.out.println((System.nanoTime() - startTime));
  }

  public static void main(String args[])
  {
      new testx();
      new testx();
      new testx();
  }
}

我总是得到类似的结果7806 660 517。为什么第一次通话的时间是其他通话的 10 倍?

4

2 回答 2

22

因为 JVM 在那个时候第一次加载了一堆 o' 类。一旦第一次System.nanoTime()返回,你已经加载了System.classand testx.class,但是一旦System.out.println进入画面,我怀疑很多 I/O 类都被加载了,这需要一些时间。

无论如何,这不是一个好的基准测试技术。在开始测量之前,您真的应该通过运行约 10000 次迭代来预热 JIT。或者(最好),使用像Caliper这样的预先构建的基准测试工具。

于 2012-08-17T19:57:45.637 回答
3

这绝对是 Louis Wasserman,它在第一轮需要更长的时间,因为它必须加载所有必要的System类,你可以通过println()在创建类的新实例之前调用一个空白来解决这个问题,因为看看当我们这样做时会发生什么:

public class testx
{
  public testx()
  {
    long startTime = System.nanoTime();
    System.out.println((System.nanoTime() - startTime));
  }

  public static void main(String args[])
  {
    //loads all System.* classes before calling constructor to decrease time it takes
    System.out.println();
      new testx();
      new testx();
      new testx();
  }
}

输出:

405 0 405

您的初始代码输出的位置:

7293 0 405

于 2012-08-17T20:25:10.787 回答