这是一个小实验:
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 ......经过几次运行后,整个循环的开销在 100x-1000x 之间!
但是,为了确定,我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
它确实似乎是循环开销,因为核心已经达到了一些非线性时序,可能是一些恒定的初始化,或者一些内核缓存的东西,等等。
错误在最后一行。
您计算了一次迭代的时间。比 1000 次迭代慢 1000 倍。