我用 C 语言编写了简单的 shell,具有作业控制和管道/重定向功能。如何比较此 shell 与 BASH 的执行时间(真实、用户和系统)?我试图测量例如 ls 命令的执行时间。问题是执行时间各不相同,ls 命令(wall time)约为 0.002 秒 - 使用 BASH 内置函数测量。如何衡量多次执行的情况?例如,我使用简单的 BASH 脚本对其多次执行进行了测量:
for i in {1..5000}
do
ls
done
我不知道如何用我的外壳做类似的事情。我在 shell 代码中编写了 for 循环,该循环解析并执行 ls 命令 5000 次,但 bash 脚本中的 for 循环可能要慢得多,因此无法比较。
答案1
这将为您提供第二个粒度,但这可能还不够,至少对于ls
.
for i in {1..5000}
do
start=${SECONDS}
ls
end=${SECONDS}
echo that took $((end - start)) seconds
done
您可以使用该date
命令获取自纪元以来的纳秒......
for i in {1..5000}
do
start=$(date +%s%N)
ls
end=$(date +%s%N)
echo that took $((end - start)) nanoseconds
done
答案2
我并不完全清楚您要测试的内容,但基本方法确实应该运行 X 次,然后取平均时间。我有一个小的 shell 函数,用来测试我在这里发布的答案,它可能可以适应您的需求。了解平均的基本逻辑,您应该能够使用它:
timethis ()
{
max=$1;
shift;
for com in "$@";
do
printf 'COMMAND: %s\n' "$com";
c=0;
while [[ $c -lt $max ]]; do
let c++;
( time -p eval "$com" ) 2>&1 | grep --color -oP 'real.*?\K[\d\.]+';
done | awk -vm=$max '{k+=$1}END{print (k/m)}';
done
}