gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:02:41 27 4
gpt4 key购买 nike

我正在尝试测量 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 执行通常的减法和除法,以获得 100000000 次迭代的大约 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 秒。有人可以帮我弄清楚我哪里出错了吗?谢谢!

最佳答案

clock 调用还测量调用 clock 并从中返回所需的时间。这会在测量中引入偏差。 IE。在 clock 函数的某个深处,它需要一个样本。但是在运行你的代码之前,它必须从 clock 的深处返回。然后,当您进行最终测量时,在可以进行那个时间采样之前,必须调用clock,并且控制必须传递到该函数内部的某处它实际获得的地方时间。因此,您将所有这些开销都包括在测量中。

您必须找出连续的 clock 调用之间经过了多少时间(通过对多对 clock 调用进行一些采样以获得准确的平均值)。这给了你一个基线偏差:在两个时钟样本之间什么都不执行需要多少时间。然后你小心地从测量中减去你的偏差。

但调用 clock 可能会干扰性能,因此您无法获得准确的答案。调用内核以获取时钟会干扰您的 L1 缓存和指令缓存。对于像这样的细粒度测量,最好下降到内联汇编并从 CPU 读取周期计数寄存器。

clock 最适用于您在第一个示例中使用的时钟:围绕执行多次迭代的事物采样,然后除以迭代次数以估计单次迭代时间。

关于c++ - 使用 clock() 分析 C++ 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9899155/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com