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