如何从总测量执行时间中删除时钟所花费的时间?

时间:2014-05-28 12:01:10

标签: c++ math timer

我正在尝试衡量一组陈述所花费的时间。以下是伪代码。该代码在Xilinx芯片组上用C ++实现,带有自定义RTOS,因此传统的c ++时钟功能在这里不起作用。

我不需要实际时间测量方面的帮助,但更多关于如何计算实际执行时间的数学方法。

one = clock.getTime();
/*statement 
*     1      *
*     to     *
*     10     */
two = clock.getTime();
fTime = two - one;

现在我知道这些陈述所花费的时间。这个时间还包括getTime()的时间对吧?

one = clock.getTime();
clock.getTime();
two = clock.getTime();
cTime = two - one;     //Just measure and the min value i get is 300 microseconds.

现在这个块给了我getTime()所花费的时间。

最后,我的问题是:

声明的实际时间是多少?

  1. fTime - cTime
  2. fTime - (2 * cTime)
  3. 其他等式?

2 个答案:

答案 0 :(得分:2)

您的时间测量会改变时间

如果它在足够稳定的平台上,则所有时间的移位都是相同的,所以

one = t1 + dt
two = t2 + dt
在减法之后,移位消除了自己,所以

two-one = (t2+dt)-(t1+dt) = t2-t1

因此在这种情况下无需对时间测量偏移进行校正。

问题始于代码执行可变的多标量/向量架构

  • 由于缓存未命中率不同
  • 不同的预取失效

依此类推,你必须使用缓存失效。此外,如果您的getTime()等待中断或HW事件也可以添加少量错误T&#39>

在这种情况下,多次测量并获得平均或最小的有效结果,如:

答案 1 :(得分:1)

通常,在进行基准测试时,我们在计时器调用之间多次执行被测任务,然后除以任务执行次数。

这是为了

  • 平滑不相关的变化,并且
  • 避免测量的持续时间低于实际时钟分辨率,并且
  • 将时间开销留在时间中可以忽略不计的一部分。

通过这种方式,您不必再担心了。

话虽如此,这可能会带来其自身的问题,尤其是在分支预测变量和缓存之类的问题上,因为前几次执行可能会使它们“预热”,从而以某种方式影响结果的准确性,不会一次运行。

正确进行基准测试可能会非常棘手,并且有大量材料可以解释如何正确进行基准测试。