/ usr / bin / time如何衡量内存使用情况?

时间:2013-10-21 12:18:09

标签: c++ linux time

我正在实现一种算法,并希望测量它的时间和内存消耗。在我的帮助下,我编写了自己的测量实用程序,它从/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,其中说

  

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

那么,第二个版本在测量我的程序的内存使用情况时是否更准确,第一个版本还测量了某种外部库使用情况?

2 个答案:

答案 0 :(得分:3)

我没有检查time的来源。但是有wait3wait4函数可以获取子进程的rusage

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

答案 1 :(得分:1)

我查看了来源(很短)。它使用getrusage()