我有一个用Java编写的解释器.我试图在解释器中测试各种优化的性能结果.为此,我解析代码,然后在代码上重复运行解释器,这一直持续到我得到5次运行,这些运行的差异非常小(下面的时间为0.1秒),取平均值并打印.解释器中没有I/O或随机性.如果我再次运行解释器,我会得到不同的运行时间:
91.8s 95.7s 93.8s 97.6s 94.6s 94.6s 107.4s
我试图无法使用服务器和客户端VM,串行和并行gc,大型表和窗口以及linux.这些是在1.6.0_14 JVM上.计算机没有在后台运行的进程.所以我问可能导致这些大变化的原因是什么,或者我怎么能找出它是什么?
由于程序必须迭代到固定点解决方案并且值存储在散列集中,因此导致实际问题.运行之间的散列值不同,导致不同的排序,这反过来导致达到解决方案所需的迭代量的变化.
"挂钟时间"很少是基准测试的良好衡量标准.现代操作系统极不可能"[没有在后台运行进程" - - 众所周知,它可能是将脏块缓冲区写入磁盘,因为它决定没有其他争用.
相反,我建议使用ThreadMXBean来跟踪实际的CPU消耗.
你的变化看起来不那么大.它只是野兽的本质,在操作系统和JVM中,还有其他东西在你的直接控制之外运行,你不可能得到确切的结果.
可能影响运行时的事情:
如果您的测试运行正在创建对象(可能对您不可见,在库调用中等),那么您的重复可能会触发GC
不同的GC算法,规范会有不同的反应,增量gc的阈值不同.您可以尝试在每次运行之前运行System.gc(),尽管在您调用它时不能保证JVM(虽然它在我玩它时总是有).T根据您的测试大小,你正在运行多少次迭代,这可能是一件令人不快的(而且几乎无用的)缓慢的事情要等待.
你在测试中做过任何随机化吗?例如,如果您正在测试整数,则值<| 128 | 可能在内存中处理稍有不同.
最终,我认为不可能得到一个确切的数字,可能你能做的最好的是围绕结果集群的平均数字.