我知道这个问题可能以前经常被问过,但似乎大多数问题都是关于一段代码的经过时间(基于挂钟).一段代码的经过时间不太可能等于实际执行时间,因为其他进程可能在感兴趣的代码的经过时间期间执行.
我使用getrusage()来获取进程的用户时间和系统时间,然后通过(用户时间+系统时间)计算实际执行时间.我在Ubuntu上运行我的程序.这是我的问题:
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处理过程中的实际指令数量,从而获得实际的工作时间.
getrusage()函数是我知道的唯一消耗“ CPU时间消耗”的标准/便携式方法。
没有简单的方法可以确定返回值的精度。我很想一次调用getrusage()以获得初始值,然后反复调用它,直到返回的值与初始值不同为止,然后假定有效精度是初始值和最终值之间的差价值观。这是一个hack(精度可能高于此方法确定的水平,并且结果应该被认为是最坏情况的估计),但这总比没有好。
我也会担心返回值的准确性。在某些内核下,我希望当计时器IRQ发生时,无论正在运行的任何代码,计数器都会增加;因此,进程可能会很幸运(并在计时器IRQ发生之前不断阻塞)或非常不幸运(并在计时器IRQ发生之前取消阻塞)。在这种情况下,“幸运”可能意味着CPU消耗看起来好像没有使用任何CPU时间,而“不幸”可能意味着占用了很少CPU时间的进程看起来却变得很像CPU消耗。
对于特定体系结构上特定内核的特定版本(在某些情况下,可能取决于是否使用特定配置选项编译内核时),可能会有一些精度更高的替代品,它们不是可移植的也不是标准的...