【发布时间】:2013-10-29 22:22:08
【问题描述】:
我正在实现一个算法,并想测量它的时间和内存消耗。为了帮助我,我编写了自己的测量实用程序,它从/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,上面写着
驻留集大小:进程在实际内存中的页数。这只是计入文本、数据或堆栈空间的页面。这不包括未按需加载或已换出的页面。
那么,第二个版本是否更准确地测量我的程序的内存使用情况,而第一个版本也测量某种外部库使用情况?
【问题讨论】:
-
为什么不阅读它的源代码?
-
你看过这个答案了吗:*.com/questions/774556/…
-
(上一条评论不正确。)哦。呃。没想到。这样做表明它执行
wait3()。 -
@Paul:是的,它似乎没有衡量总体峰值使用量,这正是我想知道的。
-
定义内存使用的含义。问题是有几种不同的可能定义:例如,您是否计算
mmapped 文件中的内存。地址空间?在执行期间的任何时候换入的总金额?在任何给定时间换入的最大金额?整个程序映像,包括从未交换过的数据?