使用clock()分析C ++线程

时间:2012-03-27 23:28:46

标签: c++

我正在尝试衡量gcc线程在我的系统上的执行情况。我写了一些非常简单的测量代码,就像这样......

start = clock();
for(int i=0; i < thread_iters; i++) {
  pthread_mutex_lock(dataMutex);
  data++;
  pthread_mutex_unlock(dataMutex);
}
end = clock();

我通过CLOCKS_PER_SEC进行通常的减法和div,以获得1000000次迭代的大约2秒的经过时间。然后我稍微更改了性能分析代码,以便我测量每个mutex_lock / unlock调用的个别时间。

for(int i=0; i < thread_iters; i++) {
  start1 = clock();
  pthread_mutex_lock(dataMutex);
  end1 = clock();
  lock_time+=(end1-start1);

  data++;

  start2 = clock();
  pthread_mutex_unlock(dataMutex);
  end2 = clock();
  unlock_time+=(end2-start2)
}

我获得相同迭代次数的时间是 锁定:~27秒 解锁:~27秒

我明白为什么程序的总时间增加,循环中的定时器调用次数增多。但是系统调用的时间仍然不到2秒。有人能帮我弄明白我哪里出错了吗?谢谢!

1 个答案:

答案 0 :(得分:3)

clock次调用还会测量调用clock并从中返回所需的时间。这在测量中引入了偏差。即在clock函数深处的某个地方需要一个样本。但是在运行代码之前,它必须从内部clock深处返回。然后当您进行结束测量时,在 时间采样之前,必须调用clock并且控制必须通过该函数内部的某个深处,实际获得时间。因此,您将所有开销作为衡量标准的一部分。

您必须了解连续clock次呼叫之间经过的时间(通过对多对clock次呼叫进行一些采样以获得准确的平均值)。这会给你一个基线偏差:在两个时钟样本之间执行任何操作需要多长时间。然后,您仔细地从测量值中减去偏差。

但拨打clock可能会影响效果,因此您无法获得准确答案。调用内核来获取时钟会干扰L1缓存和指令缓存。对于像这样的细粒度测量,最好下拉到内联汇编并从CPU读取循环计数寄存器。

clock最好用在你的第一个例子中:在多次迭代执行的事物周围取样,然后除以迭代次数来估算单次迭代时间。