getrusage 与clock_gettime()

发布于 2024-12-07 17:28:24 字数 261 浏览 3 评论 0原文

我正在尝试获取 Ubuntu 上某个进程消耗的 CPU 时间。据我所知,有两个函数可以完成这项工作:getrusage()和clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &tp)。在我的代码中,在clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &tp) 之后立即调用 getrusage() 总是给出不同的结果。

谁能帮我了解哪个函数可以提供更高的分辨率,以及这些函数有哪些优点/缺点?

谢谢。

I am trying to obtain the CPU time consumed by a process on Ubuntu. As far as I know, there are two functions can do this job: getrusage() and clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &tp). In my code, calling getrusage() immediately after clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &tp), always gives different results.

Can anyone please help me understand which function gives higher resolution, and what advantages/disadvantages of these functions have?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

打小就很酷 2024-12-14 17:28:24

getrusage(...)

  • 分别在 ru_utime 和 ru_stime 中将 CPU 时间划分为系统组件和用户组件
  • 大致微秒分辨率: struct timeval 具有字段 tv_usec,但此分辨率通常限制为约 4ms/250Hz (来源)
  • 适用于 SVr4、4.3BSD、POSIX.1-2001:这意味着它可以在 Linux 和 OS X 上使用

请参阅手册页


clock_gettime(CLOCK_PROCESS_CPUTIME_ID, ...)

  • 系统时间和用户时间的总和,无法将其分成系统/用户时间部分。
  • 纳秒分辨率: struct timespec 是 struct timeval 的克隆,但使用 tv_nsec 而不是 tv_usec。确切的分辨率取决于计时器在给定系统上的实现方式,并且可以使用clock_getres进行查询。
  • 需要您链接到 librt
  • Clock 可能不可用。在这种情况下,clock_gettime 将返回 -1 并将 errno 设置为 EINVAL,因此最好提供 getrusage 后备。 (来源)
  • 适用于 SUSv2 和POSIX.1-2001:这意味着它可以在 Linux 上使用,但不能在 OS X 上使用。

查看手册页

getrusage(...)

  • Splits CPU time into system and user components in ru_utime and ru_stime respectively.
  • Roughly microsecond resolution: struct timeval has the field tv_usec, but this resolution is usually limited to about 4ms/250Hz (source)
  • Available on SVr4, 4.3BSD, POSIX.1-2001: this means it is available on both Linux and OS X

See the man page


clock_gettime(CLOCK_PROCESS_CPUTIME_ID, ...)

  • Combined total of system and user time with no way to separate it into system/user time components.
  • Nanosecond resolution: struct timespec is a clone of struct timeval but with tv_nsec instead of tv_usec. Exact resolution depends on how the timer is implemented on given system, and can be queried with clock_getres.
  • Requires you to link to librt
  • Clock may not be available. In this case, clock_gettime will return -1 and set errno to EINVAL, so it's a good idea to provide a getrusage fallback. (source)
  • Available on SUSv2 and POSIX.1-2001: this means it is available on Linux, but not OS X.

See the man page

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文