6

我正在实现一个算法,并想测量它的时间和内存消耗。为了帮助我,我编写了自己的测量实用程序,它读取/proc/[pid]/stat用户和系统消耗的时间量,以及虚拟内存和驻留集的峰值大小。(我不是 100% 清楚这两个内存统计数据之间的区别,但这不是手头的问题。)

到目前为止一切都很好,但随之而来的是一个第三方实现,我希望与我自己的程序进行比较。由于我不想摆弄它的来源,我无法使用我自己的测量程序来收集有关其效率的数据(我也许可以,但这需要我重新考虑我的测量方案)。所以我发现/usr/bin/time也采取了这些措施。

当我比较输出时,我发现/usr/bin/time确实报告了与我自己的工具相同的时间使用情况,但内存数据却大不相同。首先,/usr/bin/time不报告任何有关虚拟内存使用情况的信息,它仅提供有关最大驻留集大小的帖子。其次,报告的居民集大小/usr/bin/time大约是我自己测量的六到八倍。

所以,我一直试图找出/usr/bin/time实际如何执行它的测量,以及为什么差异如此根本。另外,哪个是正确的值?

输出示例(单位为 MB):

<program>: <virtual mem> <resident set size>
autotest (my own utility): 23.2266 2.19531
/usr/bin/time: N/A 11.23437

我正在使用 GNU/Linux 3.8.13 Mageia 3 x86_64。

编辑:作为信心提升,我发现 KDE 系统监视器支持我自己的实用程序报告的数据。事实上,它和我从同一个地方获取信息。所以信任来自的数据/proc/[pid]/stat应该是相当安全的。但问题仍然存在……

EDIT2:根据下面的答案,推断这wait3()是 GNU 使用的命令time。它以手册页 getrusage(2) 中描述的形式返回数据。在 RSS 上,它说:

这是使用的最大驻留集大小(以千字节为单位)。

手册页还提到proc/[pid]/stat,其中说

驻留集大小:进程在实际内存中的页数。这只是计入文本、数据或堆栈空间的页面。这不包括尚未按需加载或已换出的页面。

那么,第二个版本是否更准确地测量的程序的内存使用情况,而第一个版本也测量某种外部库使用情况?

4

2 回答 2

3

我没有检查time. 但是获取子进程wait3有以下功能:wait4rusage

pid_t wait3(int *status, int options, struct rusage *rusage);
pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage);

struct rusage包含最大驻留集大小值。

手册页 getrusage(2) 描述了struct rusage.

于 2013-10-21T12:38:48.950 回答
2

我查看了源代码(很短)。它使用getrusage().

于 2019-01-21T10:10:26.030 回答