我目前正在做一些uni工作,需要为多个短C程序生成多个基准。我写了一个python脚本来自动化这个过程。如何基于python脚本对C程序进行基准测试?
start = time.time()
successful = run_program(path)
end = time.time()
runtime = end - start
其中run_program
函数只是使用subprocess
模块运行C程序:
def run_program(path):
p = subprocess.Popen(path, shell=True, stdout=subprocess.PIPE)
p.communicate()[0]
if (p.returncode > 1):
return False
return True
不过,我到现在为止,我已经使用time
模块和基本计算基准这样被我们最近发现,这是衡量经过时间而不是CPU时间的指标,即这种测量对操作系统的噪音很敏感。在如此相似的问题表明,timeit
模块是用于测量CPU的时间比较好,所以我已经适应的运行方法,例如:
def run_program(path):
command = 'p = subprocess.Popen(\'time ' + path + '\', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE); out, err = p.communicate()'
result = timeit.Timer(command, setup='import subprocess').repeat(1, 10)
return numpy.median(result)
但是从看timeit
文档似乎timeit
模块仅意味着以一串字符串的形式传入的小代码片段。所以我不确定timeit
是否给了我这个计算的准确结果。因此,我的问题是:请问timeit
是测量CPU运行过程的每一步,还是只测量实际python(即subprocess
模块)代码的CPU时间?这是对一组C程序进行基准测试的准确方法吗?
可执行文件包含机器码,而不是C代码。 C标签完全不相关。 – Olaf
'时间'贝壳内置看起来像一个不错的选择。在Linux上,您还可以使用'perf stat some_program'来获取指令,时钟周期,缓存未命中和分支预测错误(或任何其他计数器集合,这些只是默认值)的性能计数器计数 –