Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java性能不一致_Java_Performance - Fatal编程技术网

Java性能不一致

Java性能不一致,java,performance,Java,Performance,我有一个用Java编写的解释器。我试图在解释器中测试各种优化的性能结果。为此,我解析代码,然后在代码上重复运行解释器,直到我得到5次运行,这5次运行相差很小(以下时间为0.1s),取平均值并打印。解释器中没有I/O或随机性。如果我再次运行解释器,我会得到不同的运行时间: 91.8s 95.7s 93.8s 97.6s 94.6s 94.6s 107.4s 我试着对服务器和客户端VM、串行和并行gc、大型表以及windows和linux都没有用。这些都在1.6.0_14 JVM上。计算机没有在后

我有一个用Java编写的解释器。我试图在解释器中测试各种优化的性能结果。为此,我解析代码,然后在代码上重复运行解释器,直到我得到5次运行,这5次运行相差很小(以下时间为0.1s),取平均值并打印。解释器中没有I/O或随机性。如果我再次运行解释器,我会得到不同的运行时间:

91.8s
95.7s
93.8s
97.6s
94.6s
94.6s
107.4s
我试着对服务器和客户端VM、串行和并行gc、大型表以及windows和linux都没有用。这些都在1.6.0_14 JVM上。计算机没有在后台运行的进程。所以我想问的是,是什么原因导致了这些巨大的变化,或者我如何才能找出是什么原因


实际问题是由于程序必须迭代到定点解决方案,并且值存储在哈希集中而导致的。运行之间的散列值不同,导致不同的顺序,从而导致达到解决方案所需的迭代量发生变化。

对于基准测试来说,“挂钟时间”很少是一个好的度量。现代操作系统极不可能“没有进程在后台运行”——正如您所知,它可能会将脏块缓冲区写入磁盘,因为它决定没有其他争用


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

垃圾收集可能负责。即使您的逻辑是相同的,也可能是GC逻辑被安排在外部时钟/事件上


但是我对JVM的GC实现知之甚少。

您的变体看起来没有那么大。beast的本质就是,在操作系统和JVM中,还有其他东西在您的直接控制之外运行,您不太可能得到确切的结果

可能影响运行时的事项:

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

  • 不同的GC算法、规格将做出不同的反应,不同的增量GC阈值。您可以尝试在每次运行之前运行System.gc(),尽管JVM不能保证在您调用它时运行gc(尽管我玩过它时它总是会运行)。T根据测试的大小和您正在运行的迭代次数,这可能是一件令人不快(而且几乎毫无用处)的慢事情

  • 在你的测试中,你是否做过任何形式的随机化?e、 g.如果您正在测试整数,那么<| 128 |的值在内存中的处理方式可能略有不同


最终,我认为不可能得到一个准确的数字,也许你能做的最好的事情就是得到一组结果的平均数字。

这对我来说似乎是一个重大的变化,我会尝试使用-verbosegc运行

如果您的流程没有任何重要的IO、输出或网络,那么您应该能够在不到一秒钟的时间内获得变化


我建议您分析应用程序,如果您还没有这样做,很可能会节省大量资源。

堆被设置为-Xms1024M-Xmx1024M。如果您想看到输出,请在命令行参数中添加-verbose:gc,因为“无进程”可能会稍微夸张。但是,任何正在运行的进程都不太可能发生干扰,但允许在一行中运行5次,每次运行的时间差仅为0.1秒。这台机器有两个核心。就抽象而言,我认为Java离硬件太远了,无法期望一致的结果。。。您只是没有足够的控制。在每次运行之前,我执行“System.runFinalization();System.gc();”并继续执行,直到空闲内存保持静态,并且没有挂起的对象。