【问题标题】:Print execution time of a shell command打印shell命令的执行时间
【发布时间】:2010-12-12 00:02:55
【问题描述】:

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

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

【问题讨论】:

    标签: shell command-line


    【解决方案1】:

    只要ps -o etime= -p "<your_process_pid>"

    【讨论】:

      【解决方案2】:

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

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

      将任何内容传送到 gnomon 都会在每行前面加上一个时间戳,指示该行在缓冲区中的最后一行有多长时间 - 即下一行出现需要多长时间。默认情况下,gnomon 将显示每行之间经过的秒数,但这是可配置的。

      【讨论】:

        【解决方案3】:

        如果我要开始一个长时间运行的过程,例如复制或哈希,并且我想知道稍后需要多长时间,我就这样做:

        $ 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】:

          添加到@mob 的答案:

          %N 附加到date +%s 可以为我们提供纳秒级精度:

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

          【讨论】:

            【解决方案5】:

            在zsh中你可以使用

            =time ...
            

            在 bash 或 zsh 中你可以使用

            command time ...
            

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

            【讨论】:

              【解决方案6】:

              不要忘记 bash 的内置 time(在您执行 time command 时应默认调用)和 /usr/bin/time(应要求您通过完整路径调用它)之间存在差异。

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

              $ 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 中错过了它,因为我只看了一眼它,我认为它是一个命令行参数.我会更新答案。
              • 9 年后,这个命令只用了 0m0.018s。我只是想我会指出这一点。
              【解决方案7】:

              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,这种灵活性让我可以测量一整套命令的时间。
              • 是否可以围绕任何 linux 命令应用 linux 方面来计算执行
              • 这种方法的一个缺点是它以秒为单位,而time 使用毫秒。如果您想在不使用变量和计算的情况下将几个命令一起计时,您可以使用括号:time ( command1 ; command2 ; command3 ) 您甚至可以将它们单独计时并加上总时间,如下所示:time ( time command1 ; time command2 ; time command3 ) 当然,如果您想要一些二十个命令,使用这个答案的解决方案可能会更好。但是,您应该开始考虑将所有命令都放在脚本中...
              【解决方案8】:
              root@hostname:~# time [command]
              

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

              【讨论】:

              • 这当然是基本答案 - 但是如果您想查看命令的错误输出并像问题一样将时间信息发送到标准输出,则会出现一些复杂情况。 time 命令写入 stderr。您的建议可能足够准确 - 因此我 +1。
              • time 写入 tty,而不是 stderr。我猜这会让事情变得更糟。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-02-28
              • 1970-01-01
              • 2018-11-30
              • 1970-01-01
              • 2017-01-28
              • 2018-07-24
              相关资源
              最近更新 更多