是否有类似时间的命令,但是要占用内存?


34

是否有类似的命令time,但报告了更多统计信息?如果能做类似的事情,那就太好了:

$ statistics some_command
time:
    real    0m3.002s
    user    0m0.000s
    sys     0m0.000s
memory:
    min     41K
    peak    2.5M
    mean    1.1M
. . .

如果可以走得更远,那就太好了。现在,为了调试,我要么专心盯着top(实际上是glances),要么在我的代码中撒满了语句。

如果有什么我可以传递命令的地方,那就太好了。

编辑

我可能已经找到了解决方案:perf在该软件包中linux-tools以及linux-tools-common在Ubuntu 12.04上。

$ perf stat ./someprocess
Performance counter stats for './someprocess':

      12007.384578 task-clock                #    0.996 CPUs utilized          
             1,092 context-switches          #    0.000 M/sec                  
                16 CPU-migrations            #    0.000 M/sec                  
           295,102 page-faults               #    0.025 M/sec                  
    40,553,682,299 cycles                    #    3.377 GHz                     [83.33%]
    18,400,458,723 stalled-cycles-frontend   #   45.37% frontend cycles idle    [83.35%]
     8,356,832,355 stalled-cycles-backend    #   20.61% backend  cycles idle    [66.64%]
    56,930,684,595 instructions              #    1.40  insns per cycle        
                                             #    0.32  stalled cycles per insn [83.34%]
     9,083,443,825 branches                  #  756.488 M/sec                   [83.35%]
         3,431,737 branch-misses             #    0.04% of all branches         [83.33%]

      12.051963969 seconds time elapsed

帮助的页面。


3
perf结果中没有内存统计信息。
BatchyX 2012年

“像时间,但为了记忆”并没有任何意义。什么究竟你想知道吗?内存不是度量。
Der Hochstapler 2012年

1
您是否要审核正在制作的应用程序?如果是这样,用什么语言?
dset0x 2012年

Answers:


28

zsh具有比其更强大的内置time命令bash,并且该zsh版本可以报告内存统计信息。

即使您不经常将其zsh用作日常外壳,也可以在需要收集此类统计信息时运行它。

设置TIMEFMT环境变量以指示所需的输出。这是我.zshrc档案中的内容(可能有点花哨,但我喜欢):

TIMEFMT='%J   %U  user %S system %P cpu %*E total'$'\n'\
'avg shared (code):         %X KB'$'\n'\
'avg unshared (data/stack): %D KB'$'\n'\
'total (sum):               %K KB'$'\n'\
'max memory:                %M MB'$'\n'\
'page faults from disk:     %F'$'\n'\
'other page faults:         %R'

样本输出:

% time ls
[... the output of ls, followed by:]
ls -G   0.00s  user 0.00s system 91% cpu 0.004 total
avg shared (code):         0 KB
avg unshared (data/stack): 0 KB
total (sum):               0 KB
max memory:                668 MB
page faults from disk:     0
other page faults:         337

您的回答帮助了我很多,但我有一个问题:MB的“最大内存”是多少?我相信它是KB甚至
Andres

很高兴,@ Andres。在我的测试中,“最大内存”以MB为单位,但是您可以自己编译gist.github.com/mmorearty/fa34c0f29abe454fd14b并在zsh中使用eg对其进行测试time malloc-bytes 10000000。这将malloc 10兆字节,因此请尝试一下,然后查看zsh报告什么。
Mike Morearty 2015年

根据zsh docs %M,最大内存为兆字节。
gerrard00

%M千字节为单位的
Antti Haapala

16

与Bash内置的版本相比,GNU时间可以报​​告更多的信息。使用command time而不是仅仅time调用它,并查看手册页或信息以获取详细信息。


2
或致电/usr/bin/time -v ./my_command.sh
ostrokach

3

根据Richard的回答,您可以创建一个别名来使用GNU时间并提供平均和最大内存信息:

alias time="$(which time) -f '\t%E real,\t%U user,\t%S sys,\t%K amem,\t%M mmem'"

或调整您的环境:

export TIME='\t%E real,\t%U user,\t%S sys,\t%K amem,\t%M mmem'

但是请注意,这仅适用于/usr/bin/time默认情况下通常不调用的方法。

从手册页:

K该进程的平均总(数据+堆栈+文本)内存使用量,以千字节为单位。

M进程在其生存期内的最大常驻集大小,以KB为单位。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.