简而言之:
(微型)基准测试非常复杂,因此请使用基准测试框架http://www.ellipticgroup.com/misc/projectLibrary.zip之类的工具-
仍然对结果持怀疑态度(“将微型信任放入微型基准”,Cliff Click博士)。
详细地:
有很多因素会严重影响结果:
- System.nanoTime的准确性和精确度:最坏的情况是与System.currentTimeMillis一样糟糕。
- 代码预热和类加载
- 混合模式:仅在足够频繁地调用代码块(1500或1000次)之后,JVM的JIT编译(请参见Edwin Buck的答案)
- 动态优化:取消优化,堆栈替换,消除无效代码(您应该使用循环中计算出的结果,例如打印出来)
- 资源回收:垃圾收集(请参阅Michael Borgwardt的答案)和对象完成
- 缓存:I / O和CPU
- 您的操作系统总体上:屏幕保护程序,电源管理,其他进程(索引器,病毒扫描等)
Brent
Boyer的文章“严格的Java基准测试,第1部分:问题”(http://www.ibm.com/developerworks/java/library/j-benchmark1/index.html)很好地描述了所有这些问题以及是否/原因您可以针对它们(例如,使用JVM选项或预先调用ProcessIdleTask)。
您将无法消除所有这些因素,因此进行统计是个好主意。但:
- 而不是计算最大值和最小值之间的差,您应该努力计算标准偏差(结果{1,1000×2,3}与{501×1,501×3}不同)。
- 通过产生置信区间(例如,通过引导)来考虑可靠性。
上面提到的Benchmark框架(http://www.ellipticgroup.com/misc/projectLibrary.zip)使用了这些技术。您可以在Brent
Boyer的文章“ Robust
Java基准测试,第2部分:统计和解决方案”(https://www.ibm.com/developerworks/java/library/j-benchmark2/)中阅读有关它们的信息。



