2011-01-07 8 views
1

私が理解しているように、PHP stdClassは、コードが実際に問題を起こすのに十分深く入れ子になっていると、一般に配列よりも高速です。どのように私はその場でstdClassオブジェクトを定義するために型キャストしていた場合に効率が影響を受けるということです。オブジェクトとしてキャストされるPHP配列の効率?

$var = (object)array('one' => 1, 'two' => 2); 

コードこれを行うには、私が明示的にオブジェクトとして$varを定義したほうが良いでしょう、多くの何回も実行されようとしている場合代わりに:私はそこからいずれかの方法で、上のオブジェクトとして$varにアクセスすることがありますので、

$var = new stdClass(); 
$var->one = 1; 
$var->two = 2; 

はごくわずかの違いですか?

編集:

AはstdClassは、私はここに必要なデータ型です。私は配列を使うべきかどうか、またはstdClassオブジェクトを使うべきかどうかについては心配していません。私はより具体的にstdClassを具体化する(object)array(....)の略語を使用するのが効率的かどうかと懸念しています。そして、はい、これは潜在的に何千回も実行されるコードにあります。

+1

stdClassは配列の代わりではありません。代わりにArrayObjectを試してください。また、「はるかに速く」は相対的であり、ほとんどの場合実際には無関係です。 – Mchl

答えて

3
function benchmark($func_name, $iterations) { 
    $begin = microtime(true); 
    for ($i = 0; $i < $iterations; $i++) { 
     $func_name(); 
    } 
    $end = microtime(true); 

    $execution_time = $end - $begin; 

    echo $func_name , ': ' , $execution_time; 
} 

function standClass() { 
    $obj = new stdClass(); 
    $obj->param_one = 1; 
    $obj->param_two = 2; 
} 

function castFromArray() { 
    $obj = (object)array('param_one' => 1, 'param_two' => 2); 
} 


benchmark('standClass', 1000); 
benchmark('castFromArray', 1000); 

benchmark('standClass', 100000); 
benchmark('castFromArray', 100000); 

出力:(

standClass: 0.0045979022979736 
castFromArray: 0.0053138732910156 

standClass: 0.27266097068787 
castFromArray: 0.20209217071533 

場ではstdClassへの配列からキャストは約30%、より効率的ですが、あなたが操作を10万回を実行します知っているまで、違いがまだごくわずかですそれでも、少なくとも私のマシンでは、1/10秒しか見ていない)。

要するに、大部分の時間は大したことではありませんが、そうであれば、単一のコマンドで配列を定義し、それをオブジェクトに型キャストします。問題のコードをボトルネックと認識していない限り、心配することはありません(可能であれば、繰り返し回数を減らすことに集中します)。

7

間違ったことを理解しています。オブジェクトは配列よりもはるかに高速ではありません。実際には、配列には継承(および可視性ルックアップ)の問題がないため、通常は逆です。確かに重要な利得/損失を明らかにする特定のケースがあるかもしれませんが、一般的なケースではアレイの方が高速になりがちです...

意味的に正しいツールを使用してください。オブジェクトの方が速いと思うので、配列の使用を避けてください。それが理にかなっている場合は、コンストラクトを使用します配列をオブジェクトで置き換えることが理にかなっていることがあります(たとえば、厳密に配列の型を強制する場合など)。しかし、これはそれらの一つではありません。それでもarray()をSTDClassに置き換えない場合は、カスタムクラス(ArrayObjectを拡張するか、少なくともIteratorArrayAccessインターフェイスを実装する可能性が高いクラス)に置き換えます。異なる理由でData Structuresが存在します。配列の代わりにオブジェクトを使用するほうが良い場合は、代わりにオブジェクトを使用するのではないでしょうか?

「高速キャスト」のようなマイクロ最適化について心配する必要はありません。それはalmost always notです。読み取り可能で正しいコードを書いてください。問題が発生している場合は最適化してください。

0

正しいジョブに適切なデータ構造を選択することが重要です。

使用するものを決定するときは、自分自身に質問してください。データは何を表していますか?

あなたはセットまたはシーケンスを表していますか?おそらく配列を使うべきです。

あなたは特定の性質や行動を持つことを表現していますか?おそらくオブジェクトを使うべきです。

関連する問題