モノノフ日記

普通の日記です

オブジェクトと連想配列のパフォーマンス

でハッシュとオブジェクトのインスタンス生成の比較ベンチマークについて書かれていますが、b:id:i_ogiがブコメで言ってるように毎回配列定義するよりコピーした方が早いと思ったので試してみました。

array.php
<?php
$result = array();
$insert = array('member0'=>0,'member1'=>1,'member2'=>2,'member3'=>3);
for($i=0;$i<1000000;$i++) {
    $result[] = $insert;
}
echo 'Memory: '.memory_get_usage()."\n";
object.php
<?php
class Test {
    public $member0 = 0;
    public $member1 = 1;
    public $member2 = 2;
    public $member3 = 3;
}
for($i=0;$i<1000000;$i++) {
    $result[] = new Test();
}
echo 'Memory: '.memory_get_usage()."\n";

変更点はarray.phpでループの前で配列を定義するようにしただけです。

ベンチマーク結果

$ time php array.php
Memory: 48239884

real    0m0.366s
user    0m0.304s
sys     0m0.062s

$ time php object.php
Memory: 413386464

real    0m2.194s
user    0m1.855s
sys     0m0.334s

ちょ、コピーのが早いのはわかっていたけどここまで違うとは。。。
「クラスの代わりに連想配列を使うのは止めるべき」じゃなくて「オブジェクトを連想配列代わりに使うのは止めるべき」かなぁと。

PHPの変数管理や配列管理の方法についてはCPA-LABテクニカルの記事が参考になります。