2013-07-13 14 views
6

下の2つの簡略スニペットは、結果が変わらないことがわかります。プロトタイプオブジェクトを複製すると、オブジェクトを最初から作成するよりもパフォーマンスが向上しますか?

パターン1、ゼロからオブジェクト:プロトタイプオブジェクトをクローニング

foreach ($recipients as $recipient) { 
    $message = new Message(); 
    $message->setBody("This is the body of the message."); 
    $message->setRecipient($recipient); 

    $transport->sendMessage($message); 
    $persister->saveToDatabase($message); // Updated line 
    unset($message); 
} 

パターン2:

$prototype = new Message(); 
$prototype->setBody("This is the body of the message."); 

foreach ($recipients as $recipient) { 
    $message = clone $prototype; 
    $message->setRecipient($recipient); 

    $transport->sendMessage($message); 
    $persister->saveToDatabase($message); // Updated line 
    unset($message); 
} 
unset($prototype); 

オブジェクトクローニング(パターン2)は、最初からオブジェクトを作成するよりもパフォーマンス向上を提供しています(パターン1)をメモリ使用量、ガベージコレクション、CPUサイクルの点から見ていますか?固定されたプロパティ(インスタンス間で変化しない)とループの数が高いことも考慮してください。


アップデート:ループごとに異なるオブジェクトインスタンスが必要です。私はsaveToDatabaseという例を追加してそれに似ています。たとえば、メッセージにIDを付けましょう。 ;)

答えて

0

あなたの場合、オブジェクトの複製は必要ありません。この時

ルック:

$message = new Message(); 
$message->setBody("This is the body of the message."); 

foreach ($recipients as $recipient) { 
    $message->setRecipient($recipient); 
    $transport->sendMessage($message); 
} 

これは、少なくともメモリを使用する必要があります。 オブジェクトを破壊することはできません。 GCがあなたのためにそれをやりましょう。メモリ使用量のクローニングの点で

私は手動で設定解除が必要であるかどうかわからないんだけど

...

Best way to destroy PHP object?

What's better at freeing memory with PHP: unset() or $var = null

すべてのプロパティがコピーされているので、新しいオブジェクトと同じでなければなりません。しかし、クローニングはわずかに高速です。 thisベンチマークを見てください。通常

:誰かがあなたのコードであなたを支援してきましたが、質問を訪れる他人の利益のために、ここでタイトルに頼まれているものへの答えだよう

+0

あなたの答えをありがとう。私の場合、2つの異なるインスタンスが必要です。この要件をよりよく反映するように質問を更新しました。しかし、私は 'クローン'ベンチマークへのあなたの参照は、私の質問にかなり答えてくれると思います。 –

+0

クローンはコンストラクタを探して実行する必要はありません。コンストラクタが重いほど、利益は大きくなります。 – tacone

+0

@taconeそれは魔法の__clone()を探す必要があります。したがって、実行部分のみが異なり、すべてがクラスに依存します。 – IMSoP

3

が見えます。 newキーワードを指定すると、__construct()マジックメソッドが実行されます。 cloneキーワードを使用すると、__clone()マジックメソッドが実行されます。

プロトタイプパターンのポイントは、高価なコンストラクタを繰り返し再実行することを避けることです。特に、最終結果(オブジェクトの内部状態に関して)が毎回同じ場合は避けてください。

プロトタイプパターンは、多くのオブジェクトが必要な場合だけでなく、重大なパフォーマンス上の問題に対処する必要がある場合にのみ通常使用されます。

関連する問題