Bash 循环的开销是循环核心的 1000 倍

Bash 循环的开销是循环核心的 1000 倍

这是一个小实验:

t1=$(date +%s%N)
ta=0
for i in `seq 1 1000`
do
    t1a=$(date +%s%N)
    echo blabla
    t2a=$(date +%s%N)
    ((ta=ta+(t2a-t1a)))
done
t2=$(date +%s%N)
echo diffb: $((t2-t1))ns
echo diffba: $((t2a-t1a))ns

结果:

diffb: 2767264439ns # this is the overall result
diffba: 1482172ns # this is the aggregated result for the core

我可以看到人们现在在想:这显然是循环核心内的仪器。但不是。我在一个更复杂的循环中看到了这一点,其中包括 IO 操作、排序、uniq、if、cp...经过几次运行后,整个循环的开销在 100 倍到 1000 倍之间!

但是,为了确定,我将echo blabla与交换了date +%s%N。结果:

diffb: 3713962570ns
diffba: 2662492ns

这绝对不是仪器!

好的,那么试试这个:

a=0; while [[ $((a++)) -lt 1000 ]];

结果:

diffb: 3761656210ns
diffba: 1953502ns

我在这里错过了什么吗?这里是否有一些显而易见的事情,为什么这些结果是错误的?还是我只是偶然发现了现实? Bash 循环的开销是宇宙中最高的?

(我想优化代码,所以我开始测量基线,但似乎无法优化。)

编辑:我做了其他事情,我将迭代计数从 1000 减少到 500(我为此使用了 while 循环),结果:

diffb: 1886513017ns
diffba: 2328892ns

与之比较:

diffb: 3761656210ns
diffba: 1953502ns

它确实似乎是一个循环开销,因为核心已经达到了一些非线性时间,可能是一些常量初始化,或者一些内核缓存等等。

答案1

该错误在最后一行。

您计算了一次迭代的时间。比 1000 次迭代慢 1000 倍。

相关内容