【问题标题】:Which is more efficient when creating many objects together in php?在 php 中一起创建多个对象时哪个更有效?
【发布时间】:2013-08-05 02:18:27
【问题描述】:

例如,我想创建“obj”对象: 方法一:

$myobj1=new obj();
$myobj2=new obj();
$myobj3=new obj();
$myobj4=new obj();

创建一个对象然后复制它更有效吗?例如: 方法二:

$myobj1=new obj();
$myobj2=clone $myobj1;
$myobj3=clone $myobj1;
$myobj4=clone $myobj1;

考虑到 php 是写时复制的,在 $myobj1 和其他一些 obj 从未在运行时使用的情况下,我会获得更好的性能吗?通过复制对象而不是创建对象,我是否总能获得更好的性能?

【问题讨论】:

  • 这两个例子不一样。首先,您创建 4 个新对象。在第二个中,您创建 one 对象,然后将其分配给 3 个变量。在第二个你需要做:$myobj2=clone $myobj1; 等等。
  • Yap 现在修复了它,最初我打算问同样的关于数组的问题,忘记更改问题中的一些内容,但会立即克隆完成这项工作,还是它仍然在写入时复制?跨度>

标签: php object copy clone


【解决方案1】:

在 100000 次循环的测试中,我得到了这样的结果:

bin/php-test CloneVsNew
[============================================================>] 100000 u | 4399 u/s | Est: 0.0 s | Mem: 342,74 KB | Max: 367,1 KB
[============================================================>] 100000 u | 4105 u/s | Est: 0.0 s | Mem: 343,14 KB | Max: 367,1 KB
New         1,282884 sec.
Clone       1,107343 sec.

所以,似乎 clone 复制对象的效率稍高一些。 这是测试代码:

class CloneVsNew extends TestApplication
{
    final public static function run()
    {
        $repeats = 100000;
        $bar = new CliProgressBar($repeats);
        for ($i = 0; $i <= $repeats; ++$i) {
            Timer::start();
            $myobj1=new \stdClass();
            $myobj2=new \stdClass();
            $myobj3=new \stdClass();
            $myobj4=new \stdClass();
            Timer::stop();
            $bar->update($i);
        }

        self::addResult('New', Timer::get());

        $bar = new CliProgressBar($repeats);

        Timer::reset();
        for ($i = 0; $i <= $repeats; ++$i) {
            Timer::start();
            $myobj1 = new \stdClass();
            $myobj2 = clone $myobj1;
            $myobj3 = clone $myobj1;
            $myobj4 = clone $myobj1;
            Timer::stop();
            $bar->update($i);
        }

        self::addResult('Clone', Timer::get());
    }
}

测试日期:

php -v
PHP 5.4.17-1~dotdeb.1 (cli) (built: Jul  6 2013 16:20:31) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
    with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans

其他php版本可以显示其他结果。

更新:

用于测试使用php-bench 工具。

【讨论】:

  • clone 基本上只是一个 C memcpy,所以它会更快一点是有道理的。但是,差异可以忽略不计,并且仅在您克隆大量对象时才有意义...
  • @alexander-yancharuk +1 为您的测试虽然我得到了 100000 的不稳定结果(最快的有时是新的 sometmes 克隆,因为差异可以忽略不计并且每次分配不同的资源)我意识到作为差异可以忽略不计 Sverri M. Olsen 是对的。因为没有太大区别,memcpy 可以立即发生而无需等待更改,但我没有看到系统监视器上的内存使用量增加,这可能是因为对象不包含任何数据。当我有空闲时间时,我将不得不检查填充对象。
  • 我已经用 99999999 个对象完成了它(希望大多数时候他们会获得相同的资源)我得到了:新:506.75122475624 克隆:530.91913843155 我仍然不是确定如果对象包含一些数据或在构造函数中发生了操作,这是否会是结果。
  • php -v: PHP 5.4.16 (cli) (built: Jun 6 2013 11:15:55) Copyright (c) 1997-2013 The PHP Group Zend Engine v2.4.0, Copyright (c ) 1998-2013 Zend Technologies 和 Xdebug v2.2.2,版权所有 (c) 2002-2013,作者 Derick Rethans
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多