2013-07-13 5 views
6

Sie können zwei vereinfachte Schnipsel unten sehen, dass nicht in ihrem Ergebnis variieren. 1Bietet das Klonen eines Prototypobjekts eine Leistungsverbesserung gegenüber der Neuanlage von Objekten?

Muster, Objekte von Grund auf:

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); 
} 

Muster 2, einen Prototypobjekt Klonieren:

$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); 

Ist das Objekt Klonieren (Muster 2) liefern Leistungsverbesserungen gegenüber Objekten von Grund auf neu erstellen (Muster 1) in Bezug auf Speichernutzung, Speicherbereinigung und/oder CPU-Zyklen? Berücksichtigen Sie auch eine hohe Anzahl von festen Eigenschaften (die sich zwischen den Instanzen nicht ändern) und eine hohe Anzahl von Schleifen.


Update: Ich brauche verschiedene Objektinstanzen in jeder Schleife. Ich fügte saveToDatabase Anruf zu den Beispielen hinzu, um dem zu ähneln, lassen Sie es zum Beispiel eine Identifikation der Mitteilung geben. ;)

Antwort

0

In Ihrem Fall ist Gegenstand Klonen nicht erforderlich.

Blick auf diese:

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

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

Dies sollte den am wenigsten Speicher. Und Sie können ein Objekt nicht zerstören. Lass den GC das für dich tun.

Ich bin mir nicht sicher, ob manuell unsetting erforderlich ist ..

Best way to destroy PHP object?

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

In Bezug auf die Speichernutzung Klonen als neues Objekt gleich sein sollte, da jede Eigenschaft kopiert wird. Aber das Klonen ist etwas schneller. Sehen Sie sich this Benchmark an.

+0

Vielen Dank für Ihre Antwort. In meinem Fall sind zwei verschiedene Instanzen erforderlich. Ich habe meine Frage aktualisiert, um diese Anforderung besser widerzuspiegeln. Aber ich denke, Ihr Hinweis auf den "Klon" -Benchmark wird meine Frage ziemlich gut beantworten: besser klonen als neue Objekte erstellen. –

+0

Clone muss nicht nach einem Konstruktor suchen und ihn ausführen. Je schwerer der Konstrukteur, desto größer der Nutzen. – tacone

+0

@tacone Es muss allerdings für eine magische __clone() sehen, es ist also nur der Ausführungsteil, die variiert und hängt alles von der Klasse. – IMSoP

3

Sieht aus wie jemand, den Sie mit Ihrem Code geholfen hat, sondern zum Wohle der anderen die Frage besuchen, hier ist die Antwort auf das, was im Titel gefragt wird:

Regel. Das Schlüsselwort new bewirkt, dass die magische Methode __construct() ausgeführt wird. das clone Schlüsselwort bewirkt, dass die __clone() magische Methode auszuführen.

Der Punkt des Prototyp-Musters ist, wiederholtes Ausführen eines teuren Konstruktors zu vermeiden, besonders wenn das Endergebnis (hinsichtlich des internen Zustands der Objekte) jedes Mal gleich ist.

Die Prototyp-Muster wird normalerweise nur dort eingesetzt, wo es ein signifikantes Performance-Problem ist, dass behandelt werden muss nicht nur, wenn Sie eine Menge von Objekten benötigen.