执行无偏见的程序/脚本性能比较

时间:2010-10-29 14:19:18

标签: java c++ python jython performance

我想对基本相同的算法的多个实现进行比较,用Java,C ++和Python编写,后者在Mac OS X 10.6.4 Macbook Pro上使用Pypy,Jython和CPython执行正常(非SSD)HDD。

它是“解码来自文件的数据流”类型的算法,其中相关测量是总执行时间,并且我想通过例如防止偏差来防止偏差。操作系统是一个硬盘缓存,其他程序同时运行,太大/小样本文件等。我需要注意什么才能创建一个公平的比较?

4 个答案:

答案 0 :(得分:1)

这些很难做好。

在许多情况下,操作系统会缓存文件,因此第二次执行时,它们会突然表现得更好。

另一个问题是您将解释语言与已编译语言进行比较。解释型语言需要在某处将解释器加载到内存中,否则它们无法运行。为了严格公平,您应该考虑解释器的内存使用和加载时间是否应该成为测试的一部分。如果您在一个可以假设解释器始终被预加载的环境中寻找性能,那么您可以忽略它。 Web服务器的许多设置都能够保持解释器的预加载。如果您在桌面上执行临时客户端应用程序,那么在加载解释器时启动速度可能非常慢。

答案 1 :(得分:0)

为了防止偏见,我建议先停止所有不必要的进程在后台运行。

我不确定Windows,但在linux下你可以通过 drop_caches 清除硬盘缓存 有关如何使用它的信息here

此外,您可能希望对应用程序的多次运行取平均值,这样任何HDD或OS干扰都不会使结果产生偏差。

答案 2 :(得分:0)

我建议您只需多次运行每个程序(如20个左右)并对每组进行最低测量。这将使程序很可能使用高清缓存和其他类似的东西。如果他们都这样做,那么它就没有偏见。

答案 3 :(得分:0)

要完全不偏不倚是不可能的,你可以做各种事情,比如运行最小进程等,但IMO最好的方法是在不同的日子里长时间以随机顺序运行脚本,得到平均值,这将接近unbias尽可能。

因为最终代码将以随机顺序在这样的环境中运行,并且您对平均行为感兴趣而不是某些数字。