我正在实现一种算法,并希望测量它的时间和内存消耗。在我的帮助下,我编写了自己的测量实用程序,它从/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
,其中说
驻留集大小:进程在实际内存中的页数。这只是计算文本,数据或堆栈空间的页面。这不包括未加载需求或换出的页面。
那么,第二个版本在测量我的程序的内存使用情况时是否更准确,第一个版本还测量了某种外部库使用情况?
答案 0 :(得分:3)
我没有检查time
的来源。但是有wait3
和wait4
函数可以获取子进程的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()
。