克隆原型对象是否比从头创建对象提供了性能改进?

时间:2013-07-13 12:25:17

标签: php object clone

您可以在下方看到两个简化的摘要,其结果不会发生变化。

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

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


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

2 个答案:

答案 0 :(得分:4)

看起来有人帮助您使用了您的代码,但为了其他人访问该问题,以下是标题中提到的答案:

一般。 new关键字会导致__construct()魔术方法运行; clone关键字会导致__clone()魔术方法运行。

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

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

答案 1 :(得分:0)

在您的情况下,不需要对象克隆。

看看这个:

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

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

这应该使用最少的内存。 你无法摧毁一个物体。让GC为你做。

我不确定是否需要手动取消设置..

Best way to destroy PHP object?

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

就内存使用而言,克隆应与新对象相同,因为每个属性都被复制。但克隆速度稍快一些。看看this基准。