2

在经典 APUE(UNIX 环境中的高级编程)的第 3.9 节中,作者测量了在他的示例程序中消耗的用户/系统时间,该示例程序针对不同的缓冲区大小(一个 I/O 读/写程序)运行。

结果表有点像(所有时间都以秒为单位):

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
...

我很好奇并且真的想知道如何测量一个程序的用户/系统 CPU 时间?

在这个例子中,这CLOCK TIME意味着什么以及如何衡量它?

显然,它不仅仅是用户 CPU 时间和系统 CPU 时间的总和。

4

2 回答 2

4

time您可以使用以下命令轻松测量程序的运行时间*nix

$ time myprog

real        0m2.792s
user        0m0.099s
sys         0m0.200s

realor指的CLOCK_TIME是挂钟时间,即从程序开始到完成所花费的时间,甚至包括其他进程在内核上下文切换它们时所占用的时间片。它还包括任何时间,进程被阻塞(在 I/O 事件等上)

userorUSER_CPU是指在用户空间(即内核之外)花费的 CPU 时间。与real时间不同,它仅指特定进程占用的 CPU 周期。

sysor是指在内核空间中花费的SYSTEM_CPUCPU 时间(作为系统调用的一部分)。同样,这只是代表进程计算在内核空间中花费的 CPU 周期,而不是它被阻塞的任何时间。

在该time实用程序中,userand是根据系统调用中的一个或系统调用sys计算得出的。通常使用在程序开始和结束时使用系统调用收集的 2 个时间戳中的时间差来计算。times()wait()realgettimeofday()

您可能还想知道的另一件事是real != user + sys。在多核系统上,usersys或它们的总和很容易超过real时间。

于 2013-03-15T07:54:39.007 回答
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);
于 2013-03-15T07:49:31.643 回答