代码性能严格测量

时间:2017-01-27 21:38:36

标签: c++ linux performance clock

我正在创建用于在CentOS 7中测量单个消息处理时间的性能框架工具。我使用 isolcpus 内核选项为此任务预留了一个CPU,并使用 taskset 。

好的,现在问题了。我试图测量几个消息中的最大处理时间。处理时间<= 1000ns,但是当我运行多次迭代时,我得到非常高的结果(> 10000ns)。

在这里,我创建了一些简单的代码,它没有任何有趣的功能但显示了问题。根据迭代次数,我可以得到如下结果:

max: 84 min: 23 -> for 1000 iterations
max: 68540 min: 11 -> for 100000000 iterations

我试图了解这种差异来自哪里?我尝试使用具有最高优先级的实时调度来运行此操作。有没有办法防止这种情况?

#include <iostream>
#include <limits>
#include <time.h>

const unsigned long long SEC = 1000L*1000L*1000L;

inline int64_t time_difference( const timespec &start,
                             const timespec &stop ) {
    return ( (stop.tv_sec * SEC - start.tv_sec * SEC) +
             (stop.tv_nsec - start.tv_nsec));
}
int main()
{
    timespec start, stop;
    int64_t max = 0, min = std::numeric_limits<int64_t>::max();

    for(int i = 0; i < 100000000; ++i){
        clock_gettime(CLOCK_REALTIME, &start);
        clock_gettime(CLOCK_REALTIME, &stop);
        int64_t time = time_difference(start, stop);
        max = std::max(max, time);
        min = std::min(min, time);
    }
    std::cout << "max: " << max << " min: " << min << std::endl;
}

2 个答案:

答案 0 :(得分:2)

即使使用isolcpus,您也无法将抖动降低到零,因为您仍然至少拥有以下内容:

1)中断传送到你的CPU(你可能能够减少我对irq affinity的麻烦 - 但可能不会为零。)

2)仍然为您的进程安排时钟计时器中断,并且可能在内核端执行可变数量的工作。

3)CPU本身可能暂时暂停P状态或C状态转换,或其他原因(例如,在打开AVX电路后让电压电平稳定等)。

答案 1 :(得分:1)

让我们查看文档......

  

隔离将对用户空间进程产生影响 - 内核线程仍可能在isolcpus隔离的CPU上进行调度。

所以似乎不能保证完全隔离,至少不是来自内核。