【问题标题】:Does cloning a prototype object provide performance improvement over creating objects from scratch?克隆原型对象是否比从头创建对象提供了性能改进?
【发布时间】:2013-07-11 21:30:24
【问题描述】:

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

模式 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 周期方面,与从头开始创建对象(模式 1)相比,对象克隆(模式 2)是否提供了性能改进?还要考虑大量的固定属性(在实例之间不会改变)和大量的循环。


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

【问题讨论】:

    标签: php object clone


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      看看这个:

      $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 基准测试。

      【讨论】:

      • 感谢您的回答。就我而言,需要两个不同的实例。我更新了我的问题以更好地反映这一要求。但我认为您对clone 基准的引用将很好地回答我的问题:克隆比创建新对象更好。
      • 克隆不需要寻找构造函数并执行它。构造函数越重,收益越大。
      • @tacone 它确实必须寻找一个神奇的 __clone() ,所以它只是执行部分有所不同,并且完全取决于类。
      猜你喜欢
      • 2010-10-14
      • 1970-01-01
      • 2015-04-27
      • 2016-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      相关资源
      最近更新 更多