Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在php中一起创建多个对象时,哪一个更有效?_Php_Object_Copy_Clone - Fatal编程技术网

在php中一起创建多个对象时,哪一个更有效?

在php中一起创建多个对象时,哪一个更有效?,php,object,copy,clone,Php,Object,Copy,Clone,例如,我想创建“obj”对象: 方法1: $myobj1=new obj(); $myobj2=new obj(); $myobj3=new obj(); $myobj4=new obj(); 创建对象然后复制它是否更有效?例如: 方法2: $myobj1=new obj(); $myobj2=clone $myobj1; $myobj3=clone $myobj1; $myobj4=clone $myobj1; 考虑到php是写时复制的,在$myobj1和其他一些obj从未在运行时使用的情

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

$myobj1=new obj();
$myobj2=new obj();
$myobj3=new obj();
$myobj4=new obj();
创建对象然后复制它是否更有效?例如: 方法2:

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

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

在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.
所以,克隆似乎是复制对象更有效的方法。 以下是测试代码:

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版本可以显示其他结果

更新:


对于使用的测试工具。

这两个示例不相同。首先创建4个新对象。在第二步中,创建一个对象,然后将其分配给3个变量。在第二种情况下,您需要执行:
$myobj2=clone$myobj1
等等。Yap现在修复了它。最初我想问关于数组的相同问题,但忘了更改问题中的一些内容,但是克隆会立即完成工作吗?还是仍然在写时复制?
clone
基本上只是一个C
memcpy
,所以它会更快一些。不过,这种差异可以忽略不计,只有在你克隆大量对象的情况下才有意义…@alexander yancharuk+1用于你的测试,尽管我得到100000的不稳定结果(最快的有时是新的sometmes克隆,因为这种差异可以忽略不计,每次都分配不同的资源)我意识到,由于差别可以忽略不计,斯维里·M·奥尔森是对的。因为没有太大的区别,memcpy可以直接进行,而不必等待更改,但我没有看到系统监视器上内存使用量增加,这可能是因为对象不包含任何数据。当我有空闲时间时,我必须检查填充的对象。我已经用99999999对象完成了检查(希望大多数时候它们都能得到相同的资源)我得到:New:506.75122475624 Clone:530.91913843155但我不确定如果对象包含一些数据或构造函数中发生了操作,这是否会是结果。php-v:php 5.4.16(cli)(构建:Jun 6 2013 11:15:55)版权(c)1997-2013 php组Zend Engine v2.4.0版权(c)1998-2013 Zend Technologies和Xdebug v2.2.2,版权所有(c)2002-2013,作者:德里克·雷特汉斯
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