如何衡量i7上的java性能?

如何衡量i7上的java性能?,java,performance,Java,Performance,我正在尝试对一个实际算法的两个不同实现进行典型的“a/B测试”方法,在这两种情况下使用相同的数据集。该算法在执行方面是确定性的,所以我真的希望结果是可重复的 在Core 2 Duo上,情况也是如此。仅使用linux“time”命令,我将获得大约0.1%的执行时间变化(超过10次运行) 在i7上,我会得到各种各样的变化,我可以很容易地从平均值上下变化30%。我认为这是由于i7所做的各种CPU优化(动态超频等),但这确实使进行此类测试变得困难。是否有其他方法来确定两种算法中的哪一种是“最佳的”,我可

我正在尝试对一个实际算法的两个不同实现进行典型的“a/B测试”方法,在这两种情况下使用相同的数据集。该算法在执行方面是确定性的,所以我真的希望结果是可重复的

在Core 2 Duo上,情况也是如此。仅使用linux“time”命令,我将获得大约0.1%的执行时间变化(超过10次运行)

在i7上,我会得到各种各样的变化,我可以很容易地从平均值上下变化30%。我认为这是由于i7所做的各种CPU优化(动态超频等),但这确实使进行此类测试变得困难。是否有其他方法来确定两种算法中的哪一种是“最佳的”,我可以使用其他合理的指标


编辑:该算法不能维持很长时间,这实际上是我试图测试的真实场景。因此,重复运行实际上不是一个选项。

看看是否可以在BIOS中关闭动态过时钟。此外,在进行基准测试时,要抛弃所有可能运行的其他进程。

您可以使用O-表示法原则来确定算法的性能。这将决定算法的理论速度


如果你一定要知道算法的实际运行速度,那么ofc必须在一个系统上对其进行基准测试。但是使用O-符号,你可以看到过去的一切,只关注重要的因素/变量。

你没有指出你是如何进行基准测试的。如果您尚未阅读以下内容,则可能需要阅读:

如果您正在运行一个持续的测试,我怀疑动态时钟是导致您的变化的原因。它应保持在最大涡轮转速。如果你运行的时间太长,它的热量可能会下降一倍。尽管我对此表示怀疑,除非你已经过了发条时间,并且接近热封套


超线程可能正在发挥作用。您可以在BIOS中禁用它,看看它是否会对您的数字产生影响。

在linux上,您可以锁定CPU速度以停止时钟速度变化。;)


您需要使基准尽可能现实。例如,如果您将一个算法完全运行并取平均值,那么每10毫秒执行一次相同的任务可能会得到非常不同的结果。例如,即使在时钟速度锁定的情况下,我也看到了2到10倍的变化(在完全运行和相对较低的负载之间)。

是否可以禁用这些CPU优化?也许通过编译自定义内核或设置一些/proc标志?哦,是的,我忘记了一件事:如果基准测试不使用网络通信,请在运行基准测试之前禁用NIC并重新启动。这不是微基准测试。这是一个实时计算,但它不会持续太长时间。这就是我想要证明的,也许动态时钟正在影响你。听起来你应该禁用它和超线程来排除它们。你有什么理由不能重复你的计算(比如100x)来维持更长的时间以得到更一致的结果?