【问题标题】:Incorrect Execution Time in Linux [duplicate]Linux中不正确的执行时间[重复]
【发布时间】:2023-12-15 18:21:01
【问题描述】:

致那些将我的问题标记为已回答/重复的人:给定链接中的那些解决方案无法计算 Linux 中多线程程序中的 CPU 时间。

我正在使用以下代码来查找我的代码的执行时间。它在我的 Windows 10 机器上完美运行,但在 Linux 上,我得到不正确的执行时间(例如,实际执行时间不到 2 秒,但代码打印 10 秒)。我已经尝试过 GCC 和 Intel 编译器,但仍然有同样的问题。知道有什么问题吗?感谢您的时间和帮助。

clock_t begin;
clock_t end;
double time_spent;

begin = clock();
// run some calculations //
end = clock();
time_spent = ((double)(end - begin)) / CLOCKS_PER_SEC;
printf("Elapsed: %.12f \n\n", time_spent);

【问题讨论】:

标签: c linux


【解决方案1】:

仔细阅读clock(3)time(7)man 页面(也许还有clock_gettime(2),这可能用于实现clock)。 clock 文档说明:

clock() 函数返回所用处理器时间近似值 通过程序。

(重点是我的)

也可以使用time(1) 来测量程序的时间。

注意clock 函数正在测量CPU 时间,而不是真正的挂钟时间。

实际上有传言称on Windows, clock 错误地 测量了真正的挂钟时间。但是standard clock function 确实应该给处理器时间(查看n1570,C11 标准,§7.27.2.1 了解更多信息)。

例如,如果您的长期计算正在执行一些 I/O(通常是这种情况),它可能会等待磁盘(或等待终端仿真器的输出,或来自用户的输入),并且那么 CPU 时间和真正的挂钟时间是非常不同的。

我得到不正确的执行时间(例如,实际执行时间少于 2 秒,但代码打印了 10 秒)。

如果您的程序是多线程的,它的处理器时间(在多个内核上累积)可能大于实际挂钟时间。

我尝试了 GCC 和 Intel 编译器,但仍然遇到同样的问题。

clock 功能由您的C standard library 提供。标准的<time.h> 标头只是声明它。你的libc.so.6,可能来自GNU glibc(但你也可以试试musl-libc),正在实现它。所以你应该期望改变编译器不会改变clock的行为。

知道有什么问题吗?

也许您的期望是错误的(但如果没有MCVE,我们无法确定)。

你也评论:

我找不到在我的程序中获取 CPU 时间的简单方法。

然后考虑将clock_gettime(2) 与其中之一一起使用

   CLOCK_PROCESS_CPUTIME_ID (since Linux 2.6.12)
          Per-process CPU-time clock (measures CPU time consumed by all
          threads in the process).

   CLOCK_THREAD_CPUTIME_ID (since Linux 2.6.12)
          Thread-specific CPU-time clock.

【讨论】:

  • 感谢您的完整回答。正如您在评论中提到的,我的程序是多线程的(OpenMP)。看来我需要使用另一个计时功能。
  • 不一定。您可能需要以不同方式解释时间数据。
  • 我尝试了clock_gettime(CLOCK_MONOTONIC, &var),它似乎工作得很好。
  • 测量真正的挂钟时间,而不是 CPU 时间
  • 我无法在我的程序中找到一种简单的方法来获取 CPU 时间。
最近更新 更多