Linux中的执行时间不正确

时间:2018-10-30 15:37:09

标签: c linux

对于那些将我的问题标记为已回答/重复的人:给定链接中的那些解决方案无法计算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);

1 个答案:

答案 0 :(得分:1)

请仔细阅读clock(3)time(7)(可能还有clock_gettime(2)man页,这可能是用来实现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.