如何通过对代码进行基准测试来计算std dev,quartile,...

时间:2013-08-29 15:01:59

标签: c++ c performance benchmarking

我写了一些函数来对函数/代码进行基准测试。我是这样做的:

start = timer
for(1 second)
   call fun
   iterations++
stop = timer

然后我有一个平均(AVERAGE)时间:(停止 - 开始/迭代),对吗?

单次调用太短'无法测量,所以如何从这种类型的测量,std dev,quartile等计算出来??

4 个答案:

答案 0 :(得分:4)

标准差和四分位数都处理组中值的分布。

只有一次测量,这些变得微不足道或毫无意义。由于只有一个测量值,因此该值是平均值,最小值,最大值和模式。由于没有一个测量偏离平均值,因此方差和标准偏差为零。

答案 1 :(得分:1)

你必须找到一种精确测量时间的方法。为了获得任何有意义的标准差等,您需要单独拨打fun的时间。

This question可能包含有用的提示,我相信还有很多特定于平台的高分辨率计时器。

答案 2 :(得分:1)

通常,由于处理速度和获得微分辨率和毫秒分辨率的麻烦,大多数性能测量基于大量迭代。

例如:

  1. 阅读开始时间
  2. 进行1,000,000次迭代
  3. 执行功能
  4. 端换
  5. 阅读结束时间。
  6. 持续时间是结束时间 - 开始时间。 平均执行时间是持续时间除以迭代次数。

    使用平均时间还有其他原因:操作系统中断,数据缓存未命中以及外部因素(如硬盘访问)。

    要获得更精确的测量,您必须使用“测试点”和示波器。在迭代之前将高脉冲写入测试点,然后写入低脉冲。设置示波器以捕获持续时间。如果示波器具有统计功能和存储,则在功能执行之前和之后移动测试点写入。

答案 3 :(得分:1)

如果单个电话太短而无法衡量,那你为什么要关心需要多长时间?

我有点滑稽,但如果您使用的是英特尔Linux,并且您的进程被固定在一个核心上,您可以读取CPU的时间戳计数器(TSC),这是您可以获得的最高分辨率。在最近的英特尔CPU中,它在标称CPU频率上非常稳定,与实际频率无关(变化很大)。如果谷歌为“rdtsc”,你会发现你可以调用的rdtsc()函数的几个实现。然后你可以尝试类似的东西:

uint64_t tic, elapsed[10000];

for(i=0; i<10000; i++) {
    tic = rdtsc()
    my_func()
    elapsed[i] = tic - rdtsc()
}

这可能会让你在个别函数调用的可能/有点半有效值的范围内,你可以从中产生你想要的任何统计数据(mean / mode / median / variance / std.dev。)。这个问题的有效性是值得怀疑的,但是对于像你的方法这样的东西来说,这是最好的。我更倾向于在perf record下运行整个应用程序,然后使用perf report查看周期的消耗,并关注它。