【问题标题】:How to measure user/system cpu time for a piece of program?如何测量一个程序的用户/系统 cpu 时间?
【发布时间】:2013-03-03 20:33:27
【问题描述】:

在经典 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
...

我很好奇并且真的想知道如何测量一段程序的 USER/SYSTEM CPU 时间?

在这个例子中,CLOCK TIME 是什么意思以及如何测量它?

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

【问题讨论】:

  • 所以要明确一点,您需要 C 代码,它会为您获取这些值?
  • 你真正的意思是什么?计算程序的周期时间,还是使用命令行工具获取程序的整个 CPU 时间消耗信息?您可以使用“时间”命令行获取 cpu 信息。顺便说一下,您应该向我们展示作者用来获取此日志的命令行工具名称。
  • 作者没有提到他是如何测量的。这就是为什么它激起了我的好奇心。正如您提到并由 Tuxdude 回答的那样,这项工作可以通过使用命令行工具“时间”来完成。谢谢。

标签: c unix


【解决方案1】:

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

$ time myprog

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

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

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

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

time 实用程序中,usersys 是根据times()wait() 系统调用计算得出的。 real 通常是使用在程序开始和结束时使用gettimeofday() 系统调用收集的两个时间戳的时间差来计算的。

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

【讨论】:

  • “在多核系统上,用户或系统或其总和很容易超过实时”。你能解释更多吗?
  • @Tuxdude,你能解释一下为什么 real != user + sys 吗?
【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 2012-03-20
    • 2013-08-26
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 2017-10-10
    相关资源
    最近更新 更多