为了比较不同 shell 之间脚本的运行时间,一些 SE 答案建议使用bash
's内置 time
命令,就像这样:
time bash -c 'foo.sh'
time dash -c 'foo.sh'
...ETC,对于每个要测试的 shell。此类基准测试无法消除每个 shell 加载和初始化所需的时间本身。例如,假设上述两个命令都存储在具有早期软盘读取速度的慢速设备,(124KB/秒),dash
(〜150K可执行文件)将加载大约7x比...快bash
(〜1M),shell 加载时间会使time
数字出现偏差——这些 shell 的预加载时间与测量foo.sh
每个 shell 下的运行时间无关后炮弹已装填。
用于运行脚本计时的最佳可移植和通用实用程序是什么之内每个壳?所以上面的代码看起来像这样:
bash -c 'general_timer_util foo.sh'
dash -c 'general_timer_util foo.sh'
注:无壳内置 time
命令,因为没有一个命令是可移植的或通用的。
如果 util 还能够对 shell 的内部命令和管道所花费的时间进行基准测试,那么用户无需先将它们包装在脚本中,那就更好了。像这样的人工语法会有所帮助:
general_timer_util "while read x ; do echo x ; done < foo"
有些 shelltime
可以解决这个问题。例如bash -c "time while false ; do : ; done"
作品。要查看哪些内容在您的系统上有效(和无效),请尝试:
tail +2 /etc/shells |
while read s ; do
echo $s ; $s -c "time while false ; do : ; done" ; echo ----
done
答案1
你应该注意的是time
由 POSIX 指定,并且 AFAICT POSIX 提到的唯一选项 ( -p
) 被各种 shell 正确支持:
$ bash -c 'time -p echo'
real 0.00
user 0.00
sys 0.00
$ dash -c 'time -p echo'
real 0.01
user 0.00
sys 0.00
$ busybox sh -c 'time -p echo'
real 0.00
user 0.00
sys 0.00
$ ksh -c 'time -p echo'
real 0.00
user 0.00
sys 0.00
答案2
我用GNU date
命令,支持高分辨率定时器:
START=$(date +%s.%N)
# do something #######################
"$@" &> /dev/null
#######################################
END=$(date +%s.%N)
DIFF=$( echo "scale=3; (${END} - ${START})*1000/1" | bc )
echo "${DIFF}"
然后我这样调用脚本:
/usr/local/bin/timing dig +short unix.stackexchange.com
141.835
输出单位为毫秒。
答案3
正如您所注意到的,该time
实用程序通常内置于 shell 中,这使得它作为“中性”计时器毫无用处。
但是,该实用程序通常也可以作为外部实用程序使用,/usr/bin/time
它很可能用于执行您建议的计时实验。
$ bash -c '/usr/bin/time foo.sh'
答案4
由于输入,多次修改了解决方案,在很大程度上使用/proc/uptime
和dc
//bc
awk
主动控制:
#!/bin/sh
read -r before _ < /proc/uptime
sleep 2s # do something...
read -r after _ < /proc/uptime
duration=$(dc -e "${after} ${before} - n")
# Alternative using bc:
# duration=$(echo "${after} - ${before}" | bc)
# Alternative using awk:
# duration=$(echo "${after} ${before}" | awk '{print $1 - $2}')
echo "It took $duration seconds."
显然假设/proc/uptime
存在并且具有某种形式。