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) は、メモリ使用量、ガベージ コレクション、CPU サイクルの点で、オブジェクトを最初から作成する (パターン 1) よりもパフォーマンスが向上しますか? 多数の固定プロパティ (インスタンス間で変更されない) と多数のループも考慮してください。


更新: ループごとに異なるオブジェクト インスタンスが必要です。saveToDatabaseそれに似るように例への呼び出しを追加しました。たとえば、メッセージに ID を与えます。;)

4

2 に答える 2

4

誰かがあなたのコードを手伝ってくれたようですが、質問にアクセスする他の人のために、タイトルで尋ねられたことに対する答えを次に示します。

いつもの。newキーワードにより、マジック__construct()メソッドが実行されます。cloneキーワードにより、マジック__clone()メソッドが実行されます。

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

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

于 2015-07-27T22:48:11.343 に答える
0

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

これを見てください:

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

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

これにより、使用するメモリが最小になります。また、オブジェクトを破壊することはできません。GC にお任せください。

手動で設定を解除する必要があるかどうかはわかりません..

PHPオブジェクトを破壊する最良の方法は?

PHP でメモリを解放するには、unset() または $var = null のどちらが優れているか

すべてのプロパティがコピーされるため、メモリ使用量に関しては、複製は新しいオブジェクトと同じである必要があります。ただし、クローン作成はわずかに高速です。このベンチマークを見てください。

于 2013-07-13T12:51:13.020 に答える