我正在尝试对现实生活算法的两种不同实现进行典型的“A / B测试”方法,在两种情况下使用相同的数据集。该算法在执行方面是确定性的,所以我真的希望结果是可重复的。
在Core 2 Duo上,情况也是如此。仅使用linux“time”命令,我将获得大约0.1%(超过10次运行)的执行时间变化。
在i7上我会得到各种各样的变化,我可以轻松地从平均值上下变换30%。我认为这是由于i7所做的各种CPU优化(动态超频等),但它确实很难做到这种测试。有没有其他方法可以确定2种算法中的哪种算法“最佳”,我可以使用其他任何合理的指标?
编辑:算法不能持续很长时间,这实际上是我试图进行基准测试的现实场景。所以反复运行并不是一个真正的选择。
答案 0 :(得分:3)
查看是否可以关闭BIOS中的动态超频。此外,在进行基准测试时,抛弃所有可能的其他进程。
答案 1 :(得分:1)
您可以使用O符号原则来确定算法的性能。这将决定算法的理论速度。
http://en.wikipedia.org/wiki/Big_O_notation
如果你绝对必须知道算法的真实生活速度,那么你必须在系统上对它进行基准测试。但是使用O符号可以看到所有这些,只关注重要的因素/变量。
答案 2 :(得分:0)
您没有说明您的基准测试方式。如果您还没有阅读此内容:How do I write a correct micro-benchmark in Java?
如果您正在进行持续测试,我怀疑动态时钟会导致您的变化。它应该保持在最大涡轮速度。如果你运行它的时间太长,也许它会降低一倍的热量。虽然我对此表示怀疑,除非你超时并且接近热封套。
超线程可能正在扮演一个角色。您可以在BIOS中禁用它,看看它是否会对您的数字产生影响。
答案 3 :(得分:0)
在Linux上,您可以锁定CPU速度以停止时钟速度变化。 ;)
您需要使基准测试尽可能真实。例如,如果您运行算法平坦并取平均值,那么每10毫秒执行相同任务可能会得到非常不同的结果。即使锁定时钟速度,我已经看到2x到10x的变化(在平坦输出和相对低负载之间)。