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

C:在多线程程序中使用clock()测量时间,c,C,我一直使用clock()来衡量我的应用程序从开始到完成所花费的时间,如下所示: int main(int argc, char *argv[]) { const clock_t START = clock(); // ... const double T_ELAPSED = (double)(clock() - START) / CLOCKS_PER_SEC; } 自从我开始使用POSIX线程以来,这似乎失败了。看起来时钟()随着N个线程的增加快了N倍。由于我不知道有多少线程将

我一直使用clock()来衡量我的应用程序从开始到完成所花费的时间,如下所示:

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

  // ...

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

自从我开始使用POSIX线程以来,这似乎失败了。看起来时钟()随着N个线程的增加快了N倍。由于我不知道有多少线程将同时运行,这种方法失败了。那么,我如何衡量时间流逝了多少呢?

您需要什么样的计时分辨率?您可以使用time.h中的time()作为第二分辨率。如果您需要更高的分辨率,那么您可以使用更特定于系统的东西。请参见

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

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

但是,正如您所说,您正在使用POSIX,这意味着您可以使用
time.h
中定义的
clock\u gettime()
。为此,最好使用
时钟\u单调的
时钟:

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;
(请注意,我仔细地计算了
经过的时间
,以确保在非常短的时间间隔计时时不会丢失精度)


如果您的操作系统没有提供
CLOCK\u MONOTONIC
(您可以在运行时使用
sysconf(\u SC\u MONOTONIC\u CLOCK)
进行检查),然后,您可以使用
CLOCK\u REALTIME
作为回退-但请注意,后者的缺点是,如果在进程运行时更改系统时间,则会生成错误的结果。

请参阅此答案以获取可移植的解决方案:>>这是@caf在上的大量误导性答案中发布的正确答案所以这对于支持POSIX的实时系统尤其正确。我不会使用时钟、时间、gettimeofday或任何其他函数来实现此目的。你所说的“仔细地”计算经过的时间是什么意思?使用两个单独的语句而不是将它们组合成一个赋值有什么意义吗?@sevko:不,它可以在一个语句中完成-我指的是从两个“纳秒”部分中分别减去两个“秒”部分,而不是(例如)首先将“finish”和“start”转换为浮点值,然后减去它们。如果没有线程处于睡眠状态,则此方法有效,但无法测量每帧后的剩余CPU时间。是否缺少命名空间?标识符“clock_gettime”未定义。也适用于单调时钟