通用非 bash `time` 基准替代方案?

通用非 bash `time` 基准替代方案?

为了比较不同 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/uptimedc//bcawk主动控制

#!/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存在并且具有某种形式。

相关内容