在经典APUE(UNIX环境中的高级编程)的3.9节中,作者测量了他的示例程序中消耗的用户/系统时间,该程序针对不同的缓冲区大小(I / O读/写程序)运行。 / p>
结果表有点像(所有时间都以秒为单位):
BUFF_SIZE USER_CPU SYSTEM_CPU CLOCK_TIME LOOPS
1 124.89 161.65 288.64 103316352
...
512 0.27 0.41 7.03 201789
...
我很好奇并且真的想知道如何测量一个程序的USER / SYSTEM CPU时间?
在这个例子中,CLOCK TIME
意味着什么以及如何衡量它?
显然,这不仅仅是用户CPU时间和系统CPU时间的总和。
答案 0 :(得分:4)
您可以使用time
下的*nix
命令轻松衡量程序的运行时间:
$ time myprog
real 0m2.792s
user 0m0.099s
sys 0m0.200s
real
或CLOCK_TIME
是指挂钟时间,即从程序开始到完成所用的时间,甚至包括内核上下文切换时其他进程所采用的时间片。它还包括任何时间,进程被阻止(在I / O事件等)
user
或USER_CPU
是指在用户空间(即内核外)花费的CPU时间。与real
时间不同,它仅指特定进程占用的CPU周期。
sys
或SYSTEM_CPU
是指在内核空间中花费的CPU时间(作为系统调用的一部分)。同样,这只是计算代表进程在内核空间中花费的CPU周期,而不是任何时候它被阻止。
在time
实用程序中,user
和sys
来自times()
或wait()
系统调用。 real
通常使用在程序开头和结尾使用gettimeofday()
系统调用收集的2个时间戳中的时间差来计算。
您可能想知道的另一件事是real != user + sys
。在多核系统上,user
或sys
或其总和很容易超过real
时间。
答案 1 :(得分:2)
部分答案:
嗯,CLOCK_TIME与时钟显示的时间相同,时间在所谓的“真实世界”中传递。
衡量这一点的一种方法是使用gettimeofday POSIX函数,它将时间存储到调用者的struct timeval
,包含UNIX秒字段和微秒字段(实际精度通常更低)。在典型的基准代码中使用它的示例(忽略错误等):
struct timeval tv1, tv2;
gettimeofday(&tv1, NULL);
do_operation_to_measure();
gettimeofday(&tv2, NULL);
// get difference, fix value if microseconds became negative
struct timeval tvdiff = { tv2.tv_sec - tv1.tv_sec, tv2.tv_usec - tv1.tv_usec };
if (tvdiff.tv_usec < 0) { tvdiff.tv_usec += 1000000; tvdiff.tv_sec -= 1; }
// print it
printf("Elapsed time: %ld.%06ld\n", tvdiff.tv_sec, tvdiff.tv_usec);