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

时间:2010-06-03 01:23:44

标签: c

我总是用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倍。由于我不知道将同时运行多少个线程,因此这种方法失败了。那么我该如何衡量已经过了多长时间呢?

2 个答案:

答案 0 :(得分:97)

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;

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

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

答案 1 :(得分:1)

您需要什么时间分辨率?你可以使用time.h中的time()来获得第二个分辨率。如果您需要更高的分辨率,那么您可以使用更具系统性的内容。见Timer function to provide time in nano seconds using C++