编写CPU绑定脚本以测量粗略的CPU性能

时间:2011-04-16 08:27:57

标签: python performance cpu

我写了一个脚本并在不同的机器上运行它。脚本如下所示

def f(n):
    x = None
    while n:
        x = simple_math(n)
        n -= 1
    return x

start = now()
f(BIGNUM)    
print now() - start   

在脚本结束时,它会打印完成所需的时间。这是否足以将简单Python脚本的实用CPU速度与不同的机器进行比较?

简单来说,我的意思是它不使用多处理模块或任何其他技术来利用多核机器。

这个问题关于

  • 让python程序运行得更快
  • 多处理模块
  • GIL,I / O效率等。
  • 非cPython程序

只是我想确定我的方法是否理解机器之间的CPU性能是相当正确的。

4 个答案:

答案 0 :(得分:5)

所有无数现有基准测试有什么问题?更复杂的可能性更强一些。天真的方法的主要问题我 - 我不是这个主题的专家,请注意 - 可以发现:

  • 现代CPU非常复杂,并且采用非常聪明的优化。纯CPU占用的速度可能会有很大差异,具体取决于缓存可以帮助的频率,程序导致管道停顿的频率,分支预测的正确程度,以及可能的更多(这些只是我的头脑中的顶部) )。虽然当你使用运行相同脚本的相同可执行文件的相同构建执行相同的pure计算时,其中许多不应该有所不同,但是一旦你改变它们就会很重要 - 在某种程度上我们都无法预测任何这些参数(例如,由于不同的操作系统或体系结构使用不同的构建)。
  • 多线程操作系统永远不会让程序专门占用CPU。总会有一些其他程序在同一时间运行,并且您无法真正知道运行程序花费了多少x秒以及在其他程序上花了多少。至少,您应该多次运行一个程序,并花费最少的时间作为其他程序的相对较少的推断所花费的时间。即使这样,你需要在两个基准测试中获得相同的系统负载,以使数字有些意义。
  • 至少CPython不会是多线程的,所以你只能获得一个核心的速度。

但是,由于您的要求似乎只是“对CPU速度的粗略估计,完全意识到除了将CPU速度提高到数量级之外,这些数字不能用于任何事情,因此必须采取一点点的措施然后,不要告诉任何真正的应用程序的实际性能“,它可能没关系 - 只是不要认为它接近准确。尽管如此,为什么不使用一个强化的基准测试套件,已经付出了一些努力来减轻这些问题(而不是删除 - 没有人可以做到这一点)?

另请注意,timeit stdlib模块比手动操作秒表更容易使用,并尝试(不是太难,但这是一个开始)通过我提到的方法修复第二点。

答案 1 :(得分:1)

您可以通过使用这些类型的方法获得一个粗略的想法。但这不是准确的衡量标准。脚本的执行时间将取决于CPU速度以外的许多其他因素,如使用的操作系统和解释器版本,当前系统负载,内存速度等。我的建议不是依赖于此。

编辑:只是一个注释。在性能方面,许多人只考虑CPU速度,但实际上性能可能会受到系统中几乎所有内容的阻碍。例如,你有一个高速CPU但RAM很低(无论是在大小和速度上),那么你将无法提升CPU的性能。

答案 2 :(得分:1)

本质上:不。

基准测试是一个非常困难的问题,通常不值得自己解决。这一切都取决于你关心的原因。你的方法肯定会给出一个非常粗略的估计,即系统A是否优于系统B,但实际上只有在结果大不相同的时候。

您要做的是确定Real World Application X将如何在不同的计算机上执行。很少有真实世界的应用程序由简单数学循环近似。即使它(主要是科学计算),你最好在实际程序上测量时间。

真实世界的应用程序通常是非线性的,难以测量和模拟。它真的是其中一个问题已经被其他人解决得比你自己合理解决的问题要好得多。

如果您想要对性能进行粗略估计,请务必按照您的方式进行。只是不要过分相信结果,因为它们将远离你所谓的“科学”

答案 3 :(得分:0)

如果我理解你的意图正确(你可以澄清一点 - 你究竟要测量或估计的是什么,处理器速度,代码速度,其他东西和目的,但如果我理解你的话)为什么不在timeit

中检查它是如何完成的