这是一个小实验:
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 倍。