我正在尝试衡量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秒。有人能帮我弄明白我哪里出错了吗?谢谢!
答案 0 :(得分:3)
clock
次调用还会测量调用clock
并从中返回所需的时间。这在测量中引入了偏差。即在clock
函数深处的某个地方需要一个样本。但是在运行代码之前,它必须从内部clock
深处返回。然后当您进行结束测量时,在 时间采样之前,必须调用clock
并且控制必须通过该函数内部的某个深处,实际获得时间。因此,您将所有开销作为衡量标准的一部分。
您必须了解连续clock
次呼叫之间经过的时间(通过对多对clock
次呼叫进行一些采样以获得准确的平均值)。这会给你一个基线偏差:在两个时钟样本之间执行任何操作需要多长时间。然后,您仔细地从测量值中减去偏差。
但拨打clock
可能会影响效果,因此您无法获得准确答案。调用内核来获取时钟会干扰L1缓存和指令缓存。对于像这样的细粒度测量,最好下拉到内联汇编并从CPU读取循环计数寄存器。
clock
最好用在你的第一个例子中:在多次迭代执行的事物周围取样,然后除以迭代次数来估算单次迭代时间。