【问题标题】:C: using clock() to measure time in multi-threaded programsC:在多线程程序中使用clock()测量时间
【发布时间】:2011-02-27 02:43:31
【问题描述】:

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

【问题讨论】:

标签: c


【解决方案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++

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2012-04-11
    相关资源
    最近更新 更多