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

She*_*har 5 python cpu performance

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

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

start = now()
f(BIGNUM)    
print now() - start   
Run Code Online (Sandbox Code Playgroud)

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

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

这个问题不是关于

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

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

小智 5

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

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

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

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


tas*_*oor 1

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

编辑:只是一个注释。当谈到性能时,许多人只考虑 CPU 速度,但实际上系统上的几乎所有内容都会阻碍性能。例如,您有一个高速 CPU,但 RAM 较低(无论是大小还是速度),那么您将无法获得 CPU 的性能提升。