2013-07-13 6 views
6

Możesz zobaczyć dwa uproszczone fragmenty poniżej, które nie różnią się pod względem wyniku.Czy klonowanie obiektu prototypowego zapewnia poprawę wydajności w stosunku do tworzenia obiektów od początku?

wzór 1, obiekty od podstaw

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

Wzór 2 klonowanie obiektu prototype:

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

Does klonowanie obiektu (wzór 2) zapewniają wyższą wydajność ponad tworzenia obiektów od zera (wzór 1) pod względem wykorzystania pamięci, odśmiecania i/lub cykli procesora? Rozważ także dużą liczbę stałych właściwości (które nie zmieniają się między instancjami) i dużą liczbę pętli.


Aktualizacja: Potrzebuję różnych wystąpień obiektu w każdej pętli. Dodałem saveToDatabase połączenie do przykładów, aby przypominać to, niech to na przykład da identyfikator do wiadomości. ;)

Odpowiedz

0

W twoim przypadku klonowanie obiektów nie jest konieczne.

Spójrz na to:

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

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

Należy użyć najmniejszą pamięć. I nie możesz zniszczyć obiektu. Niech GC zrobi to za Ciebie.

Nie jestem pewien, czy ręcznie wyłączające jest konieczne ..

Best way to destroy PHP object?

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

chodzi o wykorzystanie pamięci klonowanie powinno być takie samo jak nowego obiektu ponieważ każda nieruchomość jest kopiowany. Ale klonowanie jest nieco szybsze. Spójrz na benchmark this.

+0

Dzięki za odpowiedź. W moim przypadku wymagane są dwa różne przypadki. Zaktualizowałem moje pytanie, aby lepiej odzwierciedlić to wymaganie. Ale myślę, że twoje odniesienie do benchmarków 'clone' odpowie dobrze na moje pytanie: lepiej klonować niż tworzyć nowe obiekty. –

+0

Klon nie musi szukać konstruktora i wykonywać go. Im cięższy konstruktor, tym większa korzyść. – tacone

+0

@tacone Musi jednak szukać magicznego __clone(), więc różni się tylko częścią wykonawczą i wszystko zależy od klasy. – IMSoP

3

Wygląda jakby ktoś pomógł ci w kodzie, ale z korzyścią dla innych odwiedzających pytanie, oto odpowiedź na to, co jest zadane w tytule:

zwykle. Słowo kluczowe new powoduje uruchomienie metody magicznej __construct(); Słowo kluczowe clone powoduje uruchomienie magicznej metody __clone().

Punkt wzoru prototypu polega na tym, że wielokrotnie unika się ponownego uruchamiania kosztownego konstruktora, szczególnie gdy wynik końcowy (w kategoriach stanu wewnętrznego obiektów) jest taki sam za każdym razem.

Wzorzec prototypowy jest normalnie używany tylko wtedy, gdy występuje znaczny problem z wydajnością, którym należy się zająć, nie tylko wtedy, gdy potrzebnych jest wiele obiektów.

Powiązane problemy