tetsunosukeのnotebook

tetsunosukeのメモです

Benchmarkブームなのでarray_pushについて書いておく

"PHPの素朴な疑問とか - まちゅダイアリー"にて、ループに関するベンチマークの補足をしてもらいました。コンパイル時の最適化、というのは確かにあるのかもなあ...


で、1~10000までの数値を要素とする配列を作る例について、今更感もあるが測定結果。

--------------------------------------------------------------
<?php
require_once 'Benchmark/Timer.php';

$timer =& new Benchmark_Timer(TRUE);

$array_1 = array();
for ($i = 0; $i < 10000; $i++) {
    $array_1[$i] = $i;
}
$timer->setMarker('$array[$i] = $i');

$array_2 = array();
for ($i = 0; $i < 10000; $i++) {
    $array_2[] = $i;
}
$timer->setMarker('$array[] = $i');


$array_3 = array();
for ($i = 0; $i < 10000; $i++) {
    array_push($array_3, $i);
}
$timer->setMarker('array_push');
$timer->display();

結果。

--------------------------------------------------------------
marker            time index            ex time         perct   
--------------------------------------------------------------
Start             1197809574.18282500   -                0.00%
--------------------------------------------------------------
$array[$i] = $i   1197809574.18789900   0.0050740242004395  30.05%
--------------------------------------------------------------
$array[] = $i     1197809574.19268900   0.0047898292541504  28.37%
--------------------------------------------------------------
array_push        1197809574.19965300   0.0069639682769775  41.25%
--------------------------------------------------------------
Stop              1197809574.19970800   5.5074691772461E-5   0.33%
--------------------------------------------------------------
total             -                     0.01688289642334100.00%
--------------------------------------------------------------

しかしこれ何度かやってみると$array[$i] = $iと$array[] = $i;は順位が異なるようだ(PHP 5.2.4 (cli))

とにかくarray_pushを使うと遅い。PHPには異常というほどの配列関数があり、それはそれで便利なのだけど、使った方が便利だとかわかりやすいだとかいう場合を除いてはいまいちおすすめできないかなあと思います。