如何计算命令运行所需的时间?

如何计算命令运行所需的时间?

您如何找出正在运行的进程需要多长时间才能完成?

例子:

 date; dd bs=1m if=/foo of=bar; date

^此示例只有 1 秒的分辨率。

任何外壳都是可以接受的。

答案1

使用time

$ time somecommand --with=somearguments

time将执行命令行的其余部分(在本例中somecommand --with=somearguments),当命令完成时,它将打印经过的时间。

示例输出:

$ time somecommand --with=somearguments
...
... (output of somecommand)
...
real    0m5,020s
user    0m0,010s
sys     0m0,010s

您通常需要的信息是real。在此示例中,该命令大约需要 5 秒。有关其他号码的更多信息,请参见此处:https://stackoverflow.com/questions/556405/what-do-real-user-and-sys-mean-in-the-output-of-time1


上面的示例输出来自 bash 内置命令。time是大多数 shell 中的内置命令。还有系统time。它具有不同的输出格式,但在其他方面的行为与 shell 内置函数基本相同。

要使用系统命令,您可以这样做:

$ /usr/bin/time somecommand --what=islove

或者

$ env time somecommand --baby=donthurtme

还有更多,但这超出了本问答的范围。

使用系统的示例输出time

$ env time somecommand --donthurtme=nomore
...
... (output of somecommand)
...
0.00user 0.01system 0:06.02elapsed 0%CPU (0avgtext+0avgdata 3656maxresident)k
0inputs+0outputs (0major+1089minor)pagefaults 0swaps

您通常需要的信息是elapsed。在此示例中,该命令大约需要 6 秒。对于其他数字的含义,我在互联网上没有找到很好的解释。你必须阅读手册页:http://man7.org/linux/man-pages/man1/time.1.html

有关 shell 内置命令和系统命令之间差异的更多信息,请参阅此处:内置命令和非内置命令有什么区别?

有关如何调用系统命令的更多信息,请参见此处:使用系统命令而不是内置的 Bash 而不指定完整路径


系统时间输出更加灵活。这里有一些演示

您可以更改系统的输出time。例如,用于-p获取类似于 shell 内置的输出time

$ /usr/bin/time -p somecommand --what=isyourname
...
real 0:06.02
user 0.00
sys 0.01

或使用-f编写您自己的格式:

$ /usr/bin/time -f %E somecommand --what=isyourquest
...
0:06.02

%E是“过去”的部分。您通常最感兴趣的部分。

为了完整性:您还可以time通过更改此变量来更改 bash 内置输出格式:TIMEFORMAT。更多信息:https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html#index-TIMEFORMAT


如何重定向或捕获输出

用于演示观察命令hellostdoutstderr

#!/bin/sh
sleep 0.5
echo "hello out"
echo "hello err" >&2

调用示例:

 $ ./hellostdoutstderr 
hello out
hello err

分别捕获 stdout 和 stderr

$ ./hellostdoutstderr >stdoutfile 2>stderrfile

$ cat stdoutfile
hello out

$ cat stderrfile
hello err

系统time打印到 stderr,以便通过 stderr 重定向捕获它

$ /usr/bin/time ./hellostdoutstderr >stdoutfile 2>stderrfile

$ cat stdoutfile
hello out

$ cat stderrfile
hello err
0.00user 0.00system 0:00.50elapsed 1%CPU (0avgtext+0avgdata 3672maxresident)k
0inputs+16outputs (0major+311minor)pagefaults 0swaps

您可以告诉系统time打印到单独的文件

$ /usr/bin/time -o timeoutfile ./hellostdoutstderr >stdoutfile 2>stderrfile

$ cat stdoutfile
hello out

$ cat stderrfile
hello err

$ cat timeoutfile
0.00user 0.00system 0:00.50elapsed 1%CPU (0avgtext+0avgdata 3676maxresident)k
0inputs+16outputs (0major+309minor)pagefaults 0swaps

请注意,即使 stdout 和 stderr 被重定向,bash 内置命令time也始终会打印到终端。这是可能的,因为它是内置的并且可以做任何它喜欢的事情(在 shell 中)

$ time ./hellostdoutstderr >stdoutfile 2>stderrfile

real    0m0,511s
user    0m0,005s
sys 0m0,006s

在此示例中,stdout 和 stderr 都重定向到文件。但 bash 内置命令time仍然打印到终端。

通过一些技巧,仍然可以捕获 bash 内置函数的输出。但如果使用系统命令更容易,为什么还要对抗 bash呢?如果您愿意,这里有更多信息:https://www.cyberciti.biz/faq/unix-linux-time-command-examples-usage-syntax/


要计时更复杂的命令,您有多种选择

如果你只想一个接一个地对两个命令计时

$ time { command1 ; command2 ; }

也适用于管道

$ time { command1 | command2 ; }

对于更复杂的东西

$ time sh -c ' complex command chain '

但请注意引用和其他恶作剧。最好将命令放入脚本中并为脚本计时:

$ time ./script.sh

TL;DR:time在命令之前添加。如果您想测量脚本内的时间,请使用/usr/bin/time.

相关内容