【发布时间】:2014-01-15 12:55:20
【问题描述】:
我正在尝试使用 /usr/bin/time 来收集程序的平均驻留集大小。我用几个程序尝试了这个命令,但平均驻留集大小始终为零。例如:
我的操作系统是 ubuntu 10.04。
您能告诉我是什么原因或我该如何解决吗?非常感谢!
【问题讨论】:
标签: linux
我正在尝试使用 /usr/bin/time 来收集程序的平均驻留集大小。我用几个程序尝试了这个命令,但平均驻留集大小始终为零。例如:
我的操作系统是 ubuntu 10.04。
您能告诉我是什么原因或我该如何解决吗?非常感谢!
【问题讨论】:
标签: linux
看,/usr/bin/time 本身不会计算这些数据。它使用wait4 从Linux 获取这些数据。这是wait4的描述:
>man wait4
pid_t wait4(pid_t pid, int *status, int options,
struct rusage *rusage);
问题是struct ruusage中的所有字段都没有维护:
Not all fields are completed; unmaintained fields are set to zero by the kernel. (The unmaintained fields are provided for compatibility with other systems, and because they may one day be supported on Linux.) The fields are interpreted as follows:
虽然 maxrss 被维护,但其他关于 rss 的字段却没有。所以它只返回返回 0 并且 /usr/bin/time 也打印 0。
此外,如果您查看 GNU time 的源文件,您会看到以下代码:
/*
FMT is the format string, interpreted as described above.
*/
static void
summarize (fp, fmt, command, resp)
FILE *fp;
const char *fmt;
const char **command;
RESUSE *resp;
{
while (*fmt)
{
switch (*fmt)
{
case 'M': /* Maximum resident set size. */
fprintf (fp, "%lu", ptok ((UL) resp->ru.ru_maxrss));
break;
case 't': /* Average resident set size. */
fprintf (fp, "%lu",
MSEC_TO_TICKS (v) == 0 ? 0 :
ptok ((UL) resp->ru.ru_idrss) / MSEC_TO_TICKS (v));
由于 ru_idrss 由 Linux 返回为 0,因此平均驻留集大小为 0。
有用的链接:
【讨论】: