我正在实现一个算法,并想测量它的时间和内存消耗。为了帮助我,我编写了自己的测量实用程序,它读取/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
,其中说
驻留集大小:进程在实际内存中的页数。这只是计入文本、数据或堆栈空间的页面。这不包括尚未按需加载或已换出的页面。
那么,第二个版本是否更准确地测量我的程序的内存使用情况,而第一个版本也测量某种外部库使用情况?