2013-07-13 10 views
6

Di seguito sono riportati due snippet semplificati che non variano nel loro risultato.La clonazione di un oggetto prototipo offre miglioramenti delle prestazioni rispetto alla creazione di oggetti da zero?

Schema 1, oggetti da zero:

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

Pattern 2, la clonazione di un oggetto prototipo:

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

fa la clonazione oggetto (modello 2) fornire miglioramenti delle prestazioni rispetto creare oggetti da zero (schema 1) in termini di utilizzo della memoria, raccolta dei dati inutili e/o cicli della CPU? Prendi in considerazione anche un numero elevato di proprietà fisse (che non cambiano tra le istanze) e un numero elevato di loop.


Aggiornamento: Ho bisogno di diverse istanze di oggetto in ogni ciclo. Ho aggiunto la chiamata saveToDatabase agli esempi per assomigliare, per esempio dare un ID al messaggio. ;)

risposta

0

Nel tuo caso, la clonazione dell'oggetto non è necessaria.

Guardate questa:

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

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

Questo dovrebbe utilizzare il meno memoria. E non puoi distruggere un oggetto. Lascia che il GC lo faccia per te.

io non sono sicuro se il disinserimento manuale è necessario ..

Best way to destroy PHP object?

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

In termini di memoria utilizzo clonazione dovrebbe essere lo stesso di nuovo oggetto dal momento che ogni proprietà viene copiato. Ma la clonazione è leggermente più veloce. Guarda il benchmark this.

+0

Grazie per la risposta. Nel mio caso sono richieste due istanze diverse. Ho aggiornato la mia domanda per riflettere meglio questo requisito. Ma penso che il tuo riferimento al benchmark 'clone' risponda abbastanza bene alla mia domanda: meglio clonare che creare nuovi oggetti. –

+0

Clone non ha bisogno di cercare un costruttore ed eseguirlo. Più è pesante il costruttore, più grande è il vantaggio. – tacone

+0

@tacone Tuttavia, deve cercare un __clone() magico, quindi è solo la parte di esecuzione che varia e tutto dipende dalla classe. – IMSoP

3

sembra che qualcuno ti ha aiutato con il codice, ma per il bene degli altri che visitano la domanda, ecco la risposta a quanto chiesto nel titolo:

solito. La parola chiave new causa l'esecuzione del metodo magico __construct(); la parola chiave clone causa l'esecuzione del metodo magico __clone().

Il punto del modello di prototipo è quello di evitare di ripetere ripetutamente un costoso costruttore, specialmente quando il risultato finale (in termini di stato interno degli oggetti) è sempre lo stesso.

Il modello di prototipo viene utilizzato normalmente solo in presenza di un problema di prestazioni significativo che deve essere risolto, non solo se sono necessari molti oggetti.

Problemi correlati