めも:PHPで配列に動的に要素を追加するとき

以下のように書いていて、どうやらこの書き方だと遅そうだ。

foreach (array(1,2,3) as $i) {
  $a[count($a)] = $i;
}

phpには、array_push()があるけど、配列の添字を省略すると自動的に配列の末尾に要素が足されるみたいで、関数呼び出しのオーバーヘッドがない分速いそうだ*1
というわけで、

foreach (array(1,2,3) as $i) {
  $a[] = $i;
}

と書くことにした。

どのくらい違うのか測定してみた。

% time php -r '$a=array();for($i=0;$i<500000;$i++){$a[count($a)]=$i;}echo $a[499999];'
 - 0.30s user 0.08s system 97% cpu 0.395 total
% time php -r '$a=array();for($i=0;$i<500000;$i++){$a[]=$i;}echo $a[499999];'
 - 0.21s user 0.09s system 96% cpu 0.304 total
% time php -r '$a=array();for($i=0;$i<500000;$i++){array_push($a,$i);}echo $a[499999];'
 - 0.31s user 0.08s system 95% cpu 0.407l

と、array_push()とcount()を使った場合が遅くて、添字を省略するのが一番速そうだ。

*1:要出典