6

您可以在下面看到两个简化的片段,它们的结果没有变化。

模式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);

在内存使用、垃圾收集和/或 CPU 周期方面,对象克隆(模式 2)是否比从头开始创建对象(模式 1)提供了性能改进?还要考虑大量的固定属性(在实例之间不会改变)和大量的循环。


更新:我需要在每个循环中使用不同的对象实例。我添加saveToDatabase了对示例的调用以使其类似,例如,让它为消息提供一个 ID。;)

4

2 回答 2

4

看起来有人帮助您编写代码,但为了其他人访问该问题的利益,以下是标题中所问问题的答案:

通常。new关键字使魔术__construct()方法运行;clone关键字导致魔术__clone()方法运行。

原型模式的要点是避免重复运行昂贵的构造函数,尤其是当最终结果(就对象的内部状态而言)每次都相同时。

原型模式通常仅在需要解决重大性能问题的情况下使用,而不仅仅是在需要大量对象时使用。

于 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 回答