我知道这个问题以前可能已经经常被问到,但是这些问题似乎大部分都是关于一段代码的stream逝时间(基于挂钟)的。 一段代码的stream逝时间不太可能等于实际执行时间,因为其他进程可能正在执行期间的代码所关注的时间。
我使用getrusage()获取进程的用户时间和系统时间,然后通过(用户时间+系统时间)计算实际执行时间。 我在Ubuntu上运行我的程序。 这是我的问题:
您可以通过使用内核的CPU时间功能来检查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上处理的实际指令数量,从而获得实际的工作时间。
getrusage()函数是我知道的“消耗CPU时间”的唯一标准/便携式方法。
没有简单的方法来确定返回值的精度。 我试图调用getrusage()一次来获得一个初始值,并重复调用它,直到返回的值不同于初始值,然后假设有效精度是初始值和最终值之间的差值值。 这是一个黑客行为(精确度可能高于这个方法确定的结果,结果可能被认为是最坏的情况估计),但总比没有好。
我也会关心返回值的准确性。 在某些内核中,我希望计数器会随着定时器IRQ发生时正在运行的任何代码而增加; 因此进程可能非常幸运(并且在发生定时器IRQ之前不断阻塞)或非常不幸(并且在发生定时器IRQ之前解除阻塞)。 在这种情况下,“幸运”可能意味着一个CPU大猪看起来像不使用CPU时间,而“不幸”可能意味着一个CPU时间非常短的进程,看起来像一个CPU猪。
对于特定体系结构上特定内核的特定版本(可能取决于在某些情况下是否使用特定的配置选项编译内核),可能会有更高精度的替代品,这些替代品不是便携式的,不是标准的。
你可以使用这段代码:
#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);
它会显示你的代码块的执行时间