当前位置:  开发笔记 > 编程语言 > 正文

Java性能不一致

如何解决《Java性能不一致》经验,为你挑选了2个好方法。

我有一个用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上.计算机没有在后台运行的进程.所以我问可能导致这些大变化的原因是什么,或者我怎么能找出它是什么?


由于程序必须迭代到固定点解决方案并且值存储在散列集中,因此导致实际问题.运行之间的散列值不同,导致不同的排序,这反过来导致达到解决方案所需的迭代量的变化.



1> kdgregory..:

"挂钟时间"很少是基准测试的良好衡量标准.现代操作系统极不可能"[没有在后台运行进程" - - 众所周知,它可能是将脏块缓冲区写入磁盘,因为它决定没有其他争用.

相反,我建议使用ThreadMXBean来跟踪实际的CPU消耗.



2> Steve B...:

你的变化看起来不那么大.它只是野兽的本质,在操作系统和JVM中,还有其他东西在你的直接控制之外运行,你不可能得到确切的结果.

可能影响运行时的事情:

如果您的测试运行正在创建对象(可能对您不可见,在库调用中等),那么您的重复可能会触发GC

不同的GC算法,规范会有不同的反应,增量gc的阈值不同.您可以尝试在每次运行之前运行System.gc(),尽管在您调用它时不能保证JVM(虽然它在我玩它时总是有).T根据您的测试大小,你正在运行多少次迭代,这可能是一件令人不快的(而且几乎无用的)缓慢的事情要等待.

你在测试中做过任何随机化吗?例如,如果您正在测试整数,则值<| 128 | 可能在内存中处理稍有不同.

最终,我认为不可能得到一个确切的数字,可能你能做的最好的是围绕结果集群的平均数字.

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有