我想在几个不同的条件下在linux shell中执行一些东西,并能够输出每次执行的执行时间.
我知道我可以编写一个可以执行此操作的perl或python脚本,但有没有办法在shell中执行此操作?(恰好是bash)
使用内置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
time
使用时间(1),您可以获得比内置的bash (Robert Gamble提到的)更详细的信息.通常这是/usr/bin/time
.
编者注:为了确保您调用外部实用程序 time
而不是shell的time
关键字,请将其调用为/usr/bin/time
.
time
是一个POSIX强制实用程序,但它需要支持的唯一选项是-p
.
特定平台实现特定的非标准扩展:-v
与GNU的time
实用程序一起工作,如下所示(问题标记为linux); 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
#!/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"
对于逐行delta测量,请尝试gnomon.
命令行实用程序,有点像moreutils的ts,用于将时间戳信息添加到另一个命令的标准输出.对于长期运行的过程非常有用,在这些过程中,您需要记录长时间运行的历史记录.
您还可以使用--high
和/或--medium
选项指定以秒为单位的长度阈值,gnomon将以红色或黄色突出显示时间戳.你也可以做其他一些事情.
如果你想要更精确,使用%N
与date
(和使用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
如果您打算稍后使用计算时间,请了解如何使用-f
选项/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...
我后来连接了所有$timefile
文件并将输出传输到Lua解释器.您可以使用Python或bash或任何您喜欢的语法执行相同的操作.我喜欢这种技巧.
如果你只需要精确到秒,你可以使用builtin $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
你可以使用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 }