测量 BASH 和自定义 shell 的执行时间

测量 BASH 和自定义 shell 的执行时间

我用 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
}

相关内容