2013-07-13 2 views
6

아래의 두 가지 간단한 스 니펫이 결과가 다르지 않은 것을 볼 수 있습니다.프로토 타입 개체를 복제하면 처음부터 개체를 만드는 것보다 성능이 향상됩니까?

$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)를 처음부터 객체를 생성 통해 성능 향상을 제공을 (않습니다 프로토 타입 객체 클로닝

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 :

패턴 (1)는, 처음부터 개체 패턴 1) 메모리 사용량, 가비지 수집 및/또는 CPU주기 측면에서? 고정 된 속성 (인스턴스간에 변경되지 않음)과 루프 수가 많다는 것도 고려하십시오.


업데이트 : 각 루프마다 다른 개체 인스턴스가 필요합니다. 나는 예를 들어 saveToDatabase 호출을 추가하여 메시지에 ID를 부여하는 것과 비슷하게 만든다. ;)

답변

0

경우에 따라 개체 복제가 필요하지 않습니다. 이것

봐는 :

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

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

이 최소한의 메모리를 사용합니다. 그리고 당신은 물건을 파괴 할 수 없습니다. GC가 당신을 위해 그것을하도록하십시오.

나는 모든 속성이 복사되기 때문에 메모리 사용량 복제의 관점에서 What's better at freeing memory with PHP: unset() or $var = null

Best way to destroy PHP object?

새로운 객체와 동일해야합니다 .. 수동으로 설정 해제가 필요한 경우 확실하지 않다. 그러나 복제가 약간 더 빠릅니다. this 벤치 마크를보십시오. 누군가가 당신의 코드를 도왔다처럼

+0

답변 해 주셔서 감사합니다. 제 경우에는 두 개의 서로 다른 인스턴스가 필요합니다. 이 요구 사항을보다 잘 반영하도록 질문을 업데이트했습니다. 그러나 '복제본'벤치 마크에 대한 귀하의 참조가 제 질문에 매우 잘 응답 할 것이라고 생각합니다. 새로운 객체를 만드는 것보다 복제하는 것이 좋습니다. –

+0

Clone은 생성자를 찾아서 실행할 필요가 없습니다. 생성자가 무거울수록 혜택이 커집니다. – tacone

+0

@tacone 그것은 마술 __clone()을 찾아야 만합니다. 따라서 실행 부분은 다양합니다. 모든 것은 클래스에 달려 있습니다. – IMSoP

3

보이지만 질문을 방문 다른 사람의 이익을 위해, 여기에 제목에 질문 무엇에 대한 대답입니다 : 일반적으로

은. new 키워드를 사용하면 __construct() 마법 방법을 실행할 수 있습니다. clone 키워드를 사용하면 __clone() 마법 메서드가 실행됩니다.

프로토 타입 패턴의 요점은 특히 개체의 내부 상태와 관련하여 최종 결과가 매번 같을 때 값 비싼 생성자를 반복적으로 다시 실행하지 않는 것입니다.

프로토 타입 패턴은 많은 개체가 필요할 때만이 아니라 중요한 성능 문제가있는 곳에서만 사용됩니다.

관련 문제