Bash数组迭代方向和性能

时间:2015-09-15 17:58:43

标签: arrays bash performance iteration direction

有人可以解释在向后迭代bash数组时严重减速的原因是什么?

示例:

time bash -c 'arr=();for i in {1..100000}; do arr+=( $i );done; echo "Straight"; i=0;while (( $i < 100000 )); do current_element=${arr[$i]}; ((i++));done'

Straight

real    0m0.270s
user    0m0.269s
sys 0m0.002s

time bash -c 'arr=();for i in {1..100000}; do arr+=( $i );done; echo "Reverse"; i=99999;while (( $i > 0 )); do current_element=${arr[$i]}; ((i--));done'

Reverse

real    0m25.569s
user    0m25.589s
sys 0m0.008s

另外

${arr[i-1]} + ${arr[i]} 

快得多
${arr[i]} + ${arr[i-1]}

感谢您的时间。

编辑:

  

bash --version

     

GNU bash,版本4.3.42(1)-release(x86_64-redhat-linux-gnu)

1 个答案:

答案 0 :(得分:1)

找到有关此事的一些信息。

根据http://www.tldp.org/LDP/abs/html/arrays.html

  

Bash中的数组是(循环)链接类型为string(char *)的列表。

我想这意味着每次都会从数组的开头搜索传递的元素,因此减速。 (例如:如果我们在i,为了到达i-1,我们应该从0开始看)

还找到一篇相关文章,其中包含更多关于此事的信息: http://spencertipping.com/posts/2013.0814.bash-is-irrecoverably-broken.html