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倍?
答案 0 :(得分:22)
因为JVM在那时第一次加载了一堆类。在第一个System.nanoTime()
返回后,您已经加载了System.class
和testx.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