array_pushは遅い?

両者を1万回ずつループさせてベンチマークとってみたら、array_pushの方が10倍ぐらい遅い…。 確かに、マニュアルにも「1つだけ要素を追加するならarray_pushは使わないほうが良い」と書いてあったが、まさかこんなに違うとは…。 これからは気をつけよう…。 なお、上記のベンチマーク自体はPHP4.3.11上で確認。

とあったのでとりあえず試してみました。
PHPのバージョンは5.0.4です。古くてすいません。
今回使用したプログラムは下記の通り。引用元のを若干変更しました。

array1.php

$foo = array();
for ($i=1;$i<10000;$i++) {
	array_push($foo, $i);
}

array2.php

$foo = array();
for ($i=1;$i<10000;$i++) {
	$foo[] = $i;
}

このプログラムをapachebenchでリクエスト数を1000、同時実行ユーザ数を10にして実行。
まずarray1.php(array_push)の結果

Concurrency Level:      10
Time taken for tests:   28.703693 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      176176 bytes
HTML transferred:       0 bytes
Requests per second:    34.84 [#/sec] (mean)
Time per request:       287.037 [ms] (mean)
Time per request:       28.704 [ms] (mean, across all concurrent requests)
Transfer rate:          5.99 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:    37  278 305.1    230    6615
Waiting:       37  277 304.8    229    6614
Total:         37  278 305.1    230    6615


次にarray2.php($foo[]=)の実行結果

Concurrency Level:      10
Time taken for tests:   19.891626 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      176000 bytes
HTML transferred:       0 bytes
Requests per second:    50.27 [#/sec] (mean)
Time per request:       198.916 [ms] (mean)
Time per request:       19.892 [ms] (mean, across all concurrent requests)
Transfer rate:          8.60 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1  12.2      0     166
Processing:    29  195  82.9    185     981
Waiting:        0  192  78.3    183     981
Total:         30  197  81.5    185     981

接続時間で結構な差が出てますね。
array_pushを使用した場合は最大6615、平均で278、標準偏差が305.1
対して$foo[] =の場合は最大981、平均197、標準偏差が81.5
最大で6.7倍ですかね。
平均で1.4倍。