如何在Linux下测量C程​​序的ACTUAL执行时间?

时间:2011-08-27 16:21:42

标签: c linux time

我知道这个问题可能以前经常被问过,但似乎大多数问题都与 已过去 时间(基于挂钟)有关。码。一段代码的 已过去 时间不太可能等于 实际 执行时间,因为其他进程可能是在感兴趣的代码的 已过去 期间执行。

我使用getrusage()来获取进程的用户时间和系统时间,然后通过(用户时间+系统时间)计算实际执行时间。我在Ubuntu上运行我的程序。以下是我的问题:

  1. 我如何知道getrusage的精确度()?
  2. 是否还有其他方法可以提供比getrusage更高的精度()?

3 个答案:

答案 0 :(得分:19)

您可以使用内核的CPU Time功能检查Linux上进程的实际CPU时间:

 #include <time.h>

 clock_t start, end;
 double cpu_time_used;

 start = clock();
 ... /* Do the work. */
 end = clock();
 cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;

来源:http://www.gnu.org/s/hello/manual/libc/CPU-Time.html#CPU-Time

这样,您可以计算CPU在流程上执行的CPU滴答或实际指令数量,从而获得实际的工作时间。

答案 1 :(得分:5)

getrusage()函数是我所知道的唯一标准/可移植方式,以获得“消耗的CPU时间”。

没有一种简单的方法可以确定返回值的精度。我很想调用getrusage()一次得到一个初始值,并重复调用它直到返回的值与初始值不同,然后假设有效精度是初始值和最终值之间的差值值。这是一个黑客攻击(精确度可能比这个方法更高,并且结果可能被认为是最坏的情况估计)但它总比没有好。

我也会担心返回值的准确性。在某些内核下,我希望当计时器IRQ出现时,计数器会在正在运行的任何代码中递增;因此,一个进程可能非常幸运(并且在计时器IRQ发生之前不断阻塞)或非常不幸(并且在计时器IRQ发生之前解锁)。在这种情况下,“幸运”可能意味着CPU占用看起来没有使用CPU时间,“不幸”可能意味着使用非常少的CPU时间的进程看起来像CPU占用。

对于特定体系结构上的特定内核的特定版本(可能取决于在某些情况下是否/何时使用特定配置选项编译内核),可能存在更高精度的替代方案,这些方案不可移植且不标准...

答案 2 :(得分:2)

您可以使用以下代码:

#include <sys/time.h>
struct timeval start, end;
gettimeofday(&start, NULL);
.
.
.
gettimeofday(&end, NULL);
delta = ((end.tv_sec  - start.tv_sec) * 1000000u +
         end.tv_usec - start.tv_usec) / 1.e6;
printf("Time is : %f\n",delta);

它将显示您的代码片段的执行时间