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倍。