やったことだけ書く備忘録

【今更】PHP5のcloneについて調べてみた

今更ですが、PHPにclone文というものがあって、どのライブラリも使ってないみたいなので一体どうなんだろう、ということで調べてみました。
ちなみに、PHPマニュアルはこちらです




PHP Manual::オブジェクトのクローン作成



クラスインスタンスを複製して使用する際に使えるみたいですが、都度インスタンスを生成するよりももしかしたらメモリ効率とか良くならないかなーって感じでテストしてみました。



ベンチマーク的な


以下のようなコードで、インスタンスを10000回生成した時の速度とメモリ使用量を計測。



<?php

class TestClass {
    public static 
$instance 0;

    function 
__construct() {
        
self::$instance++;
    }
    public static function 
get_instance() {
        return 
self::$instance;
    }
}

$start microtime();
$v = new TestClass();
for ( 
$i $i 9999$i++ ) {
    
$v = new TestClass(); // case 1
    //$v = clone $v;  // case 2
}
$end microtime();

list(
$stm$sts) = explode(' '$start);
list(
$edm$eds) = explode(' '$end);
echo 
'Time --> ' number_format(($edm $eds) - ($stm $sts), 4)
    . 
"\n" 'memory > ' memory_get_usage();
 


case1とcase2の場合で調べてみます。結果は以下の通り。



case1(都度インスタンス生成)

Time > 0.0094
memory > 325412

case 2(cloneで複製)

Time > 0.0031
memory > 324440


結果



メモリ使用量はさほど変わりませんでしたが、cloneの方が速度がちょっと速い。これはコンストラクタが呼ばれるコストがないからだと思われます。__clone()メソッドを定義している場合だともう少し速度は落ちるかもしれないです。



で、どう使うのか



FWなどでインスタンスをFactoryパターンで保持してシングルトンみたいに扱ってきましたが、それだとテストがやりづらいということで、cloneだとどうかな、という使い道を考えてましたが、あまり・・・って感想です。

それでも、普通にインスタンスを生成(コンストラクタを呼ぶ)する場合と複製して__clone()メソッドを呼ぶ場合とで生成方法を分岐したりする使い道があるのかなーと思いました。



感想



使ってるライブラリをあんまりみないので、ちょっと使ってみると面白いかも知れないですね。
・・・くらいの感想でした><

« 前の記事 次の記事 »

0件のコメント

コメントを投稿する

 画像に表示されている文字を入力してください。