打印shell命令的执行时间


88

是否可以通过以下组合打印shell命令的执行时间?

root@hostname:~# "command to execute" && echo "execution time"

Answers:


72

不要忘记,bash的内置函数time(在执行操作时默认情况下应调用它time command)和/usr/bin/time(应要求您通过其完整路径调用它)之间有区别。

内置time总是打印到stderr,但是/usr/bin/time将允许您将时间的输出发送到特定文件,因此您不会干扰已执行命令的stderr流。另外,/usr/bin/time的格式可以在命令行环境变量中配置TIME,而bash的内置time格式TIMEFORMAT环境变量配置。

$ time factor 1234567889234567891 # builtin
1234567889234567891: 142662263 8653780357

real    0m3.194s
user    0m1.596s
sys 0m0.004s
$ /usr/bin/time factor 1234567889234567891
1234567889234567891: 142662263 8653780357
1.54user 0.00system 0:02.69elapsed 57%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+215minor)pagefaults 0swaps
$ /usr/bin/time -o timed factor 1234567889234567891 # log to file `timed`
1234567889234567891: 142662263 8653780357
$ cat timed
1.56user 0.02system 0:02.49elapsed 63%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+217minor)pagefaults 0swaps

来自man bash:“ TIMEFORMAT变量可以设置为指定应如何显示计时信息的格式字符串”
暂停,直到另行通知。

糟糕-我认为有某种格式可以设置它的格式,但是我错过了它,help time因为我只看了一眼,并且认为它是命令行参数。我将更新答案。
Mark Rushakoff 09年

2
在这里我们已经9年了,命令只用了0m0.018s。我只是想指出这一点。
Ghassen Louhaichi,

112

time 是大多数Shell中的内置命令,用于将执行时间信息写入tty。

您也可以尝试类似

start_time=`date +%s`
<command-to-execute>
end_time=`date +%s`
echo execution time was `expr $end_time - $start_time` s.

或在bash

start_time=`date +%s`
<command-to-execute> && echo run time is $(expr `date +%s` - $start_time) s

与Maaza达成一致,这种灵活性使我能够测量整套命令的时间。
2013年

是否有可能在任何Linux命令周围应用Linux方面来计算执行
Syed Mazreena

1
这种方法的一个缺点是它以秒为单位进行测量,而time使用毫秒。而且,如果您希望将少数几个命令一起计时而不必使用变量和计算,则可以使用括号:time ( command1 ; command2 ; command3 )您甚至可以将它们与总时间一起单独计时,如下所示:time ( time command1 ; time command2 ; time command3 ) 当然,如果要使用二十个命令,可能最好使用此答案的解决方案。但是,然后,您应该开始考虑将所有命令都放在脚本中……
msb

25
root@hostname:~# time [command]

它还可以区分使用的实时时间和使用的系统时间。


这当然是基本的答案-但是,如果您想查看命令的错误输出并像问题一样将定时信息发送到标准输出,则会有些麻烦。time命令将写入stderr。您的建议可能足够准确-因此我的+1。
乔纳森·莱夫勒

2
time写入tty,而不是stderr。我想这会使情况变得更糟。
暴民

12

对于逐行增量测量,请尝试gnonom

这是一个命令行实用程序,有点像moreutils的ts,用于将时间戳信息附加到另一个命令的标准输出中。对于长时间运行的过程很有用,您需要历史记录长时间的过程。

用管道传输要gnomon的内容将在每行前面添加一个时间戳,指示该行是缓冲区中最后一行的时间(即下一行显示的时间)。默认情况下,gnomon将显示每行之间经过的秒数,但这是可配置的。

gnomon演示


8

添加到@mob的答案:

追加%Ndate +%s给了我们精确到纳秒:

start=`date +%s%N`;<command>;end=`date +%s%N`;echo `expr $end - $start`

5

如果我要启动一个长时间运行的过程(例如副本或哈希),并且想在以后知道它花费了多长时间,则可以这样做:

$ date; sha1sum reallybigfile.txt; date

这将导致以下输出:

Tue Jun  2 21:16:03 PDT 2015
5089a8e475cc41b2672982f690e5221469390bc0  reallybigfile.txt
Tue Jun  2 21:33:54 PDT 2015

当然,如此处所实现的那样,它不是很精确,也不会计算经过的时间。但这很简单,有时甚至是您所需要的。


4

在zsh中,您可以使用

=time ...

在bash或zsh中,您可以使用

command time ...

这些(通过不同的机制)强制使用外部命令。


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.