定时过程时的结果不一致

时间:2012-03-22 21:09:28

标签: java performance timing

我正在尝试使用System.currentTimeMillis()(或者System.nanoTime())计算我的程序的性能,我注意到每次运行它时 - 它会给出不同的结果完成任务。

即使是简单的测试:

long totalTime;
long startTime;
long endTime;
startTime = System.currentTimeMillis();
for (int i = 0; i < 1000000000; i++)
{
    for (int j = 0; j < 1000000000; j++)
    {
    }
}
endTime = System.currentTimeMillis();
totalTime = endTime-startTime;
System.out.println("Time: " + totalTime);

产生各种不同的输出,从0到200.任何人都可以说我做错了或建议替代解决方案吗?

2 个答案:

答案 0 :(得分:5)

循环不执行任何操作,因此您需要计算检测循环所需的时间是无意义的。

更准确地定时循环无济于事,你需要做一些有用的事情来获得可重复的结果。

如果您在32位窗口上运行,我建议您尝试-server

十亿亿个时钟周期大约需要10年时间,因此它不会多次迭代。

答案 1 :(得分:2)

这正是预期的行为 - 当你重新运行时间时它会变得更快。当您多次重新运行方法时,JIT会花费更多精力将其编译为本机代码并对其进行优化;我希望在运行这段代码足够长时间之后,JIT会彻底消除循环,因为它实际上并没有做任何事情。

在Java代码上获得精确基准测试的最佳和最简单的方法是使用像Caliper这样的工具来“预热”JIT,以鼓励它完全优化代码。