2016-07-28 33 views
1

我目前正在做一些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程序进行基准测试的准确方法吗?

+0

可执行文件包含机器码,而不是C代码。 C标签完全不相关。 – Olaf

+0

'时间'贝壳内置看起来像一个不错的选择。在Linux上,您还可以使用'perf stat some_program'来获取指令,时钟周期,缓存未命中和分支预测错误(或任何其他计数器集合,这些只是默认值)的性能计数器计数 –

回答

1

timeit将测量运行的Python进程使用的CPU时间。外部流程的执行时间将不会“记入”那些时间。

-1

更准确的方法是在C中执行此操作,从而获得真实的速度和吞吐量。

+0

这是我的备份选项;编写一段时间并运行代码的c程序,并使用子进程从我的python脚本中调用该程序。起初看起来有点凌乱,但看起来这是要走的路! –

+0

你可以在代码中嵌入计时器 – NWMG