为什么第一次调用构造函数的时间比其他函数多10倍?

时间:2012-08-17 19:56:09

标签: java performance time nanotime

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倍?

2 个答案:

答案 0 :(得分:22)

因为JVM在那时第一次加载了一堆类。在第一个System.nanoTime()返回后,您已经加载了System.classtestx.class,但一旦System.out.println出现在图片中,我怀疑很多I / O类都会被加载,这需要一些时间。

无论如何,这不是一个很好的基准测试技术;在开始测量之前,你应该通过运行~10000次迭代来加热JIT。或者(并且最好)使用预构建的基准测试工具,如Caliper

答案 1 :(得分: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