我正在尝试测量一个小功能的cpu时间,通常需要大约1500微秒。有时我会得出不正确或宽泛的置信区间。我想找到最佳准确的方法来对python 3.7中的函数进行基准测试。我想测量函数时间+获取其他计算的返回值。
我从timeit尝试了defualt_timer,请参见下面的代码。
from timeit import default_timer as timer
times=[] # store the times for 100 runs,then get min,max,averages etc
for i in range (100):
t1= timer()
x,y,z = apply_message(s,text)
t2= timer()
execution_time= (t2-t1) * 1000000 # convert it to microsecond
times+=[execution_time]
我有时发现最小值1300和最大值75000,相差很大。在其他情况下,它们很接近。我想至少看到的结果使我的95置信区间小于平均值的10%。
答案 0 :(得分:0)
如果(例如)在执行过程中将进程迁移到另一个CPU,通常会出现异常。 (因此所有内存访问都会在高速缓存中丢失一段时间,因为前一个内核的L1d和L2处于高温状态)。这也可能发生在现实生活中。
因此,您必须确定要测量的内容:“正常”的“无怪异”情况,或包括最坏情况的完整分发。
如果您保留离群值,那肯定不是高斯正态分布,因此,如果基于此假设,则对所有统计数据都加一点盐!
如果要排除异常值,请固定CPU频率,然后将进程固定到单个内核。但是,当中断处理程序或其他内核任务在该内核上进行大量工作,或者页面错误或其他任何操作时,您仍然会遇到异常情况。
或在具有超线程功能的CPU上,如果另一个线程在共享同一物理内核的同级逻辑内核上运行。或者同一台计算机上的另一个任务竞争共享资源,例如内存带宽或缓存占用量或磁盘I / O。
如果您对函数的功能以及Python的运行方式了解得足够多,则可以合理确定异常值不是“真实的”,即,您的进程在大部分壁钟中都没有CPU时间,或者发生了CPU迁移,那么您就可以丢弃超出某个阈值的异常值。
或者查看中位数时间而不是均值。中值对巨大的离群值不敏感,但仍会响应变化。
如果您重复使用相同的输入进行计时,因此您希望该功能花费相同的时间,则可以使用最小值。 (通常基本上等于中位数。)