2011-05-04 64 views
3

我试图做一个典型的“A/B测试”类似于两种不同实现算法的实现,在这两种情况下使用相同的数据集。该算法在执行方面是确定性的,所以我真的希望结果是可重复的。如何测量i7上的java性能?

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

在i7我会得到各种变化,我可以很容易有30%的变化上下平均。我认为这是由于i7所做的各种CPU优化(动态超频等),但它确实很难做这种测试。是否有其他方法可以确定2种算法中的哪种算法是“最好的”,我可以使用的任何其他合理的指标?

编辑:该算法不会持续很长时间,这实际上是我试图进行基准测试的真实场景。所以重复跑并不是真正的选择。

+0

是否可以禁用这些CPU优化?也许通过编译一个定制的内核或设置一些/ proc标志? – 2011-05-04 08:31:31

回答

3

看看您是否可以关闭BIOS中的动态超频。此外,在执行基准测试时,请关闭所有可能的其他进程。

+0

哦,是的,我忘了一件事:如果您的基准测试不使用网络通信,请在运行基准测试之前禁用您的网卡并重新启动。 – Christo 2011-05-04 08:47:26

1

那么你可以使用O-notation原则来确定算法的性能。这将决定算法的理论速度。

http://en.wikipedia.org/wiki/Big_O_notation

如果你绝对必须知道的算法FFT现实生活中的速度,然后OFC你必须标杆它的系统上。但是使用O-notation可以看到所有这些,只关注重要的因素/变量。

0

你没有指出你如何进行基准测试。如果你还没有阅读,你可能需要阅读:How do I write a correct micro-benchmark in Java?

如果你正在运行一个持续测试,我怀疑动态时钟会导致你的变化。它应该保持在最高的涡轮速度。如果你运行时间太长,也许它会降低一倍乘热量。虽然我怀疑这一点,除非你超频并且接近热量包络。

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

+0

这不是一个微基准。这是一个实时计算,但它不会持续太久。这就是我想要的基准 – krosenvold 2011-05-04 08:49:22

+0

也许动态时钟正在影响你。这听起来像你应该禁用它和超线程来排除它们。是否有任何理由不能重复你的计算(比如100x)以维持更长的时间以获得更一致的结果? – WhiteFang34 2011-05-04 09:03:27

0

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

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