下の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を付けましょう。 ;)
あなたの答えをありがとう。私の場合、2つの異なるインスタンスが必要です。この要件をよりよく反映するように質問を更新しました。しかし、私は 'クローン'ベンチマークへのあなたの参照は、私の質問にかなり答えてくれると思います。 –
クローンはコンストラクタを探して実行する必要はありません。コンストラクタが重いほど、利益は大きくなります。 – tacone
@taconeそれは魔法の__clone()を探す必要があります。したがって、実行部分のみが異なり、すべてがクラスに依存します。 – IMSoP