在shell中获取程序执行时间

时间:2008-12-22 02:27:41

标签: linux bash shell

我想在几个不同的条件下在linux shell中执行某些操作,并能够输出每次执行的执行时间。

我知道我可以编写一个可以执行此操作的perl或python脚本,但有没有办法可以在shell中执行此操作? (恰好是bash)

10 个答案:

答案 0 :(得分:497)

使用内置的time关键字:

$ help time

time: time [-p] PIPELINE
    Execute PIPELINE and print a summary of the real time, user CPU time,
    and system CPU time spent executing PIPELINE when it terminates.
    The return status is the return status of PIPELINE.  The `-p' option
    prints the timing summary in a slightly different format.  This uses
    the value of the TIMEFORMAT variable as the output format.

示例:

$ time sleep 2
real    0m2.009s
user    0m0.000s
sys     0m0.004s

答案 1 :(得分:116)

使用time(1),你可以获得比bash内置time(Robert Gamble提到的)更详细的信息。通常这是/usr/bin/time

编者注: 要确保您调用外部实用程序 time而不是shell的time 关键字,请将其调用为/usr/bin/time。<登记/> timePOSIX-mandated utility,但唯一需要支持的选项是-p
特定平台实现特定的非标准扩展:-v GNU time实用程序一起使用,如下所示(问题标记为); BSD / macOS实现使用-l生成类似的输出 - 请参阅man 1 time

详细输出示例:


$ /usr/bin/time -v sleep 1
       Command being timed: "sleep 1"
       User time (seconds): 0.00
       System time (seconds): 0.00
       Percent of CPU this job got: 1%
       Elapsed (wall clock) time (h:mm:ss or m:ss): 0:01.05
       Average shared text size (kbytes): 0
       Average unshared data size (kbytes): 0
       Average stack size (kbytes): 0
       Average total size (kbytes): 0
       Maximum resident set size (kbytes): 0
       Average resident set size (kbytes): 0
       Major (requiring I/O) page faults: 0
       Minor (reclaiming a frame) page faults: 210
       Voluntary context switches: 2
       Involuntary context switches: 1
       Swaps: 0
       File system inputs: 0
       File system outputs: 0
       Socket messages sent: 0
       Socket messages received: 0
       Signals delivered: 0
       Page size (bytes): 4096
       Exit status: 0

答案 2 :(得分:75)

#!/bin/bash
START=$(date +%s)
# do something
# start your script work here
ls -R /etc > /tmp/x
rm -f /tmp/x
# your logic ends here
END=$(date +%s)
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"

答案 3 :(得分:39)

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

  

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

您还可以使用--high和/或--medium选项指定以秒为单位的长度阈值,gnomon将以红色或黄色突出显示时间戳。你也可以做其他一些事情。

example

答案 4 :(得分:18)

如果您想要更高精度,请将%Ndate一起使用(并使用bc作为差异,因为$(())仅处理整数。)

以下是如何操作:

start=$(date +%s.%N)
# do some stuff here
dur=$(echo "$(date +%s.%N) - $start" | bc)

printf "Execution time: %.6f seconds" $dur

示例:

start=$(date +%s.%N); \
  sleep 0.1s; \
  dur=$(echo "$(date +%s.%N) - $start" | bc); \
  printf "Execution time: %.6f seconds\n" $dur

结果:

Execution time: 0.104623 seconds

答案 5 :(得分:13)

如果您打算稍后使用计算时间,请了解如何使用-f的{​​{1}}选项输出节省时间的代码。这里是我最近使用的一些代码,用于获取和整理整个学生课程的执行时间:

/usr/bin/time

我后来连接了所有fmt="run { date = '$(date)', user = '$who', test = '$test', host = '$(hostname)', times = { user = %U, system = %S, elapsed = %e } }" /usr/bin/time -f "$fmt" -o $timefile command args... 个文件,并将输出传输到Lua interpreter。您可以使用Python或bash或任何您喜欢的语法执行相同的操作。我喜欢这种技巧。

答案 6 :(得分:12)

如果您只需要精确到秒,您可以使用内置$SECONDS变量,该变量计算shell运行的秒数。

while true; do
    start=$SECONDS
    some_long_running_command
    duration=$(( SECONDS - start ))
    echo "This run took $duration seconds"
    if some_condition; then break; fi
done

答案 7 :(得分:8)

您可以使用time子shell ()

time (
  for (( i=1; i<10000; i++ )); do
    echo 1 >/dev/null
  done
)

或在同一个shell {}中:

time {
  for (( i=1; i<10000; i++ )); do
    echo 1 >/dev/null
  done
}

答案 8 :(得分:2)

方式是

$ > g++ -lpthread perform.c -o per
$ > time ./per

输出是&gt;&gt;

real    0m0.014s
user    0m0.010s
sys     0m0.002s

答案 9 :(得分:0)

一个可能简单的方法(可能无法满足不同用户的需求)是使用shell PROMPT。这是一个简单的解决方案,在某些情况下可能会有用。您可以按照以下示例使用bash提示功能:

export PS1='[\t \u@\h]\$' 

以上命令将导致将shell提示符更改为:

[HH:MM:SS username@hostname]$ 

每次运行命令(或按Enter键)返回到shell提示符时,该提示符将显示当前时间。

注释:
1)请注意,如果您在键入下一个命令之前等待了一段时间,则需要考虑这个时间,即,在shell提示符中显示的时间是显示shell提示符的时间戳,而不是当您输入命令时。一些用户选择按Enter键以获取具有新时间戳记的新提示,然后再准备下一条命令。
2),还有其他可用的选项和修饰符可用于更改bash提示,有关更多详细信息,请参阅(man bash)。