C:在多线程程序中使用clock()测量时间

Posted

技术标签:

【中文标题】C:在多线程程序中使用clock()测量时间【英文标题】:C: using clock() to measure time in multi-threaded programs 【发布时间】:2010-06-03 01:23:43 【问题描述】:

我一直使用 clock() 来衡量我的应用程序从开始到结束所花费的时间,例如;

int main(int argc, char *argv[]) 
  const clock_t START = clock();

  // ...

  const double T_ELAPSED = (double)(clock() - START) / CLOCKS_PER_SEC;

自从我开始使用 POSIX 线程以来,这似乎失败了。看起来 clock() 在 N 个线程中增加了 N 倍。由于我不知道将同时运行多少个线程,因此这种方法失败了。那么如何衡量已经过去了多少时间呢?

【问题讨论】:

见Is gettimeofday() guaranteed to be of microsecond resolution? 查看此答案以获取便携式解决方案:***.com/questions/361363/… 【参考方案1】:

clock() 测量您的进程使用的 CPU 时间,而不是挂钟时间。当您同时运行多个线程时,您显然可以更快地消耗 CPU 时间。

如果您想知道挂钟的执行时间,您需要使用适当的函数。 ANSI C 中唯一的一个是time(),通常只有 1 秒的分辨率。

但是,正如您所说,您使用的是 POSIX,这意味着您可以使用在 time.h 中定义的 clock_gettime()CLOCK_MONOTONIC 时钟尤其适合用于此目的:

struct timespec start, finish;
double elapsed;

clock_gettime(CLOCK_MONOTONIC, &start);

/* ... */

clock_gettime(CLOCK_MONOTONIC, &finish);

elapsed = (finish.tv_sec - start.tv_sec);
elapsed += (finish.tv_nsec - start.tv_nsec) / 1000000000.0;

(请注意,我已经仔细计算了elapsed,以确保在非常短的时间间隔时不会丢失精度。

如果您的操作系统不提供CLOCK_MONOTONIC(您可以在运行时使用sysconf(_SC_MONOTONIC_CLOCK) 进行检查),那么您可以使用CLOCK_REALTIME 作为备用 - 但请注意后者的缺点是会生成不正确的如果在您的进程运行时更改了系统时间,则结果。

【讨论】:

>> 这是@caf 在许多关于 SO 的误导性答案的海洋中发布的正确答案。这对于支持 POSIX 的实时系统尤其正确。我不会为此目的使用时钟、时间、gettimeofday 或任何其他函数。 “仔细”计算elapsed是什么意思?使用两个单独的语句而不是将它们组合成一个作业有什么意义吗? @sevko:不,它可以在一个语句中完成 - 我指的是从两个“纳秒”部分中分别减去两个“秒”部分,而不是(例如)转换'finish' 和 'start' 首先是浮点值,然后减去它们。 虽然这在没有线程处于睡眠状态的情况下有效,但它无法测量每帧后的剩余 CPU 时间。 缺少命名空间?标识符“clock_gettime”未定义。也适用于 CLOCK_MONOTONIC【参考方案2】:

您需要什么时间分辨率?您可以使用 time.h 中的 time() 进行第二次分辨率。如果您需要更高的分辨率,那么您可以使用更特定于系统的东西。见Timer function to provide time in nano seconds using C++

【讨论】:

以上是关于C:在多线程程序中使用clock()测量时间的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Linux 多线程环境中测量函数的总执行时间

C++11:在多线程程序中使用局部静态变量导致 coredump

在多线程 C 应用程序中嵌入 python

C/C++ 测量程序效率

在多线程 C++11 程序中未处理异常时会发生啥?

在多线程 C++11 程序中未处理异常时会发生啥?