如何测量终端进程的执行时间?

我想要测量通过命令行调用的进程的执行时间(即,我想要知道进程完成所需的时间)。有没有可以添加到调用进程的命令中以实现此目的的命令?
8个回答

在你想要测量的命令之前加上time。例如:time ls
输出结果将会是:
real    0m0.606s
user    0m0.000s
sys     0m0.002s

关于realusersys的解释(来自man time):

  • real:进程使用的经过的真实(挂钟)时间,以秒为单位。
  • user:进程直接使用的CPU秒数(在用户模式下),以秒为单位。
  • sys:系统代表进程使用的CPU秒数(在内核模式下),以秒为单位。

1@ninjalj,你能提供更多关于这个命令返回的“real”,“user”和“sys”时间的信息吗? - Knowledge Cube
2@JacobVlijm 这个回答不是很详细。 :) 你可以编辑你的评论,让它更好些。 - muru
1请注意,如果您使用的是不支持内置time命令的shell,您可能需要执行sudo apt-get install time来安装它。 - poolie
1请注意,这是Bash的time内置命令的输出,但是man time将涉及一个可执行文件(例如/usr/bin/time,来自time软件包),其输出将不同。在Bash中,您可以运行help time以获取有关内置命令的帮助。 - wjandrea
请注意,进程结束并不意味着所有的工作都完成了。在刷新系统缓冲区(因此也包括未分配的系统时间)后,复制可能需要额外的几分钟。 - ubfan1
哇!它已经集成在MacOS中了。 - canbax
由于某种原因,time echo foo不显示时间。在使用time命令时,是否有办法独立显示时间? - Vencovsky

要进行逐行差量测量,请尝试gnomon

它是一个命令行实用程序,有点像moreutils的ts,可以在另一个命令的标准输出之前添加时间戳信息。对于长时间运行的进程非常有用,您可以获得历史记录以了解耗时情况。

将任何内容传输到gnomon将在每一行前面添加一个时间戳,指示该行是缓冲区中的最后一行的时间长度-也就是说,下一行出现所花费的时间。默认情况下,gnomon将显示每行之间经过的秒数,但这是可配置的。

gnomon demo


6这相当不错。 - Nathan Arthur
1如果你有npm,可以使用sudo npm i gnomon -g来安装它(这是链接中的一个错误,幸运的是URL还是正确的)。不确定它对于使用'\r'的"progress"行的处理效果如何(保持在同一行):在这种情况下,我希望它将其视为一个长行而不是多个分开的行。 - Tomasz Gandor
所以我们将其导向日晷!就这样吗? - Ciasto piekarz
2现在已经不推荐使用了,现在有没有类似的替代品? - Ivan Aracki

你可以使用time:
time ls -R

date +"%T" && cp -r ./file  /destination/folder/here && date +"%T"

在终端中运行此命令将为您提供复制文件所需的总时间。

2这将给你开始时间和结束时间,而不是持续时间。 - wjandrea
这是一个好答案,在某些情况下。例如,以下的find命令 - 没有2>/dev/null重定向 - 会产生大量的“权限被拒绝”消息。然而,加上2>/dev/null会破坏该命令中的time部分。以下提供了一个很好的折中方案:START="$(date +"%s")" && find 2>/dev/null / -path /mnt -prune -o -name "*libname-server-2.a*" -print; END="$(date +"%s")"; TIME="$((END - START))"; printf 'find command took %s sec\n' "$TIME",它的唯一输出结果是(e.g.) /usr/lib/libname-server-2.a find command took 3 sec - Victoria Stuart
对我的评论进行补充:当然,你可以简单地运行 time sudo find / -path /mnt -prune -o -name "*libname-server-2.a*" -print(即作为 sudo)-- 避免那些让人头疼的 Permission denied 警告。 - Victoria Stuart

有时候我需要一个秒表来计算一些动作的时间,比如我的应用程序启动时间,这种情况下这里提供的许多解决方案都不太有用。

对于这种情况,我喜欢使用sw

sw

安装

wget -q -O - http://git.io/sinister | sh -s -- -u https://raw.githubusercontent.com/coryfklein/sw/master/sw

使用方法

sw
 - start a stopwatch from 0, save start time in ~/.sw
sw [-r|--resume]
 - start a stopwatch from the last saved start time (or current time if no last saved start time exists)
 - "-r" stands for --resume

time -v command

-v 提供更多信息

6-v: 命令未找到 - Gqqnbig
@Gqqnbig 你是在 Mac OS 上使用这个命令吗?如果是的话,你可以通过 brew install gnu-time 安装 GNU Time,并使用 gtime 命令代替 time 命令。 - Alex Fortin
如果你使用bash作为你的shell,它会使用内置的时间函数。要使用time程序,你可以使用/usr/bin/time -v COMMAND或者command time -v COMMAND。:) - user unknown

在zsh中,time命令的输出略有不同。
解释输出的方法如下:
time sleep 10
sleep 10  0.00s user 0.00s system 0% cpu 10.011 total

最后一个数字以真实生活中的秒表记录的方式给出总时间(这是您99%时间想要的)。其他数值在这里进行解释。


  1. 打开bashrc文件

    gedit ~\.bashrc
    
  2. 找到以下文本:

    if [ "$color_prompt" = yes ]; then
        PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\] :\[\033[01;34m\]\w\[\033[00m\]\$ ' 
    
  3. 然后替换为:

    if [ "$color_prompt" = yes ]; then
        PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u\[\033[00m\] [\d|\t]:\[\033[01;34m\]\w\[\033[00m\]\$ ' 
    
  4. 重新启动终端以进行检查。

Sample output in terminal


1这将显示时间。它既不会计算与上一个命令的差异,也不会考虑等待输入和按下回车键或输入命令的时间。 - user unknown