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

Vil*_*ila 6 php clone object

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

模式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);
}
Run Code Online (Sandbox Code Playgroud)

模式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);
Run Code Online (Sandbox Code Playgroud)

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


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

bit*_*ing 0

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

看这个:

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

foreach ($recipients as $recipient) {
    $message->setRecipient($recipient);
    $transport->sendMessage($message);
}
Run Code Online (Sandbox Code Playgroud)

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

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

销毁 PHP 对象的最佳方法?

使用 PHP 释放内存哪个更好:unset() 或 $var = null

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