2

たとえば、「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 がまったく使用されない場合、パフォーマンスが向上しますか? オブジェクトを作成する代わりにコピーすることで、常にパフォーマンスが向上しますか?

4

1 に答える 1

3

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ツールを使用しました。

于 2013-08-04T06:33:31.637 に答える