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

Dil*_*Geo 23 c linux time

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

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

  1. 我怎么知道getrusage()的精确度?
  2. 还有其他方法可以提供比getrusage()更高的精度吗?

Lar*_*ars 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;
Run Code Online (Sandbox Code Playgroud)

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

这样,您可以计算CPU的滴答或CPU处理过程中的实际指令数量,从而获得实际的工作时间.

  • @Dillon Geo:不会.这是两次调用之间调用进程消耗的CPU时间. (3认同)

Bre*_*dan 5

getrusage()函数是我知道的唯一消耗“ CPU时间消耗”的标准/便携式方法。

没有简单的方法可以确定返回值的精度。我很想一次调用getrusage()以获得初始值,然后反复调用它,直到返回的值与初始值不同为止,然后假定有效精度是初始值和最终值之间的差价值观。这是一个hack(精度可能高于此方法确定的水平,并且结果应该被认为是最坏情况的估计),但这总比没有好。

我也会担心返回值的准确性。在某些内核下,我希望当计时器IRQ发生时,无论正在运行的任何代码,计数器都会增加;因此,进程可能会很幸运(并在计时器IRQ发生之前不断阻塞)或非常不幸运(并在计时器IRQ发生之前取消阻塞)。在这种情况下,“幸运”可能意味着CPU消耗看起来好像没有使用任何CPU时间,而“不幸”可能意味着占用了很少CPU时间的进程看起来却变得很像CPU消耗。

对于特定体系结构上特定内核的特定版本(在某些情况下,可能取决于是否使用特定配置选项编译内核时),可能会有一些精度更高的替代品,它们不是可移植的也不是标准的...