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

Suu*_*aku 48 c

我一直用clock()来测量我的应用程序从开始到结束的时间,因为;

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

  // ...

  const double T_ELAPSED = (double)(clock() - START) / CLOCKS_PER_SEC;
}
Run Code Online (Sandbox Code Playgroud)

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

caf*_*caf 103

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

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

但是,正如您所说,您正在使用POSIX,这意味着您可以使用clock_gettime(),定义于time.h.将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;
Run Code Online (Sandbox Code Playgroud)

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

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

  • >>这是@caf在关于SO的许多误导性答案中发布的正确答案。这对于确实支持POSIX的实时系统尤其正确。我不会为此目的使用时钟,时间,gettimeofday或任何其他函数。<< (3认同)
  • @sevko:不,它可以在一个声明中完成 - 我指的是将'秒'部分与两个'纳秒'部分分开减去,而不是(例如)将'完成'和'开始'转换为首先浮点值然后减去它们. (2认同)