加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP中的clone和new性能对比

发布时间:2023-10-13 10:26:36 所属栏目:PHP教程 来源:
导读:clone和new本不应该放在一起比较,它们的作用是不同的。但可能有一些场景下,可以用clone也可以用new,那么这时候我们选哪个呢?

我编写了两个测试,第一个是声明一个空类,第二个是带构造方法、属性的类。另外,
clone和new本不应该放在一起比较,它们的作用是不同的。但可能有一些场景下,可以用clone也可以用new,那么这时候我们选哪个呢?

我编写了两个测试,第一个是声明一个空类,第二个是带构造方法、属性的类。另外,我还加入了 PHP 序列化的测试。

国际惯例,直接上代码,一目了然。

代码:

<?php 
 
define('TEST_COUNT', 10000); 

function test($name, $callable) 
 

 
    $time = microtime(true); 
 
    $callable(); 
 
    echo $name, ' time: ', microtime(true) - $time, 's', PHP_EOL; 
 

 
// 空的类  
 
class A 
 

 
}  
 
function test1() 
 

 
    echo '空的类:', PHP_EOL; 
 
    $a = new A; 
 
    test('A clone', function() use($a){ 
 
        for($i = 0; $i < TEST_COUNT; ++$i) 
 
        { 
 
            $obj = clone $a; 
 
        } 
 
    }); 
 
    test('A new', function(){ 
 
        for($i = 0; $i < TEST_COUNT; ++$i) 
 
        { 
 
            $obj = new A; 
 
        } 
 
    }); 
 
    $serialize = serialize($a); 
 
    test('A unserialize', function() use($serialize){ 
 
        for($i = 0; $i < TEST_COUNT; ++$i) 
 
        { 
 
            $obj = unserialize($serialize); 
 
        } 
 
    }); 
 
}  
 
test1();  
 
// 带构造方法、属性的类  
 
class B 
 

 
    public $data; 
 
   
 
    public function __construct($data) 
 
    { 
 
        $this->data = $data; 
 
    } 
 
}  
 
function test2() 
 

 
    echo '带构造方法、属性的类:', PHP_EOL; 
 
    $constructData = [ 
 
        'id'            =>  1, 
 
        'name'          =>  'imi 框架牛逼', 
 
        'description'   =>  'IMI 是一款基于 Swoole 开发的协程 PHP 开发框架,拥有常驻内存、协程异步非阻塞IO等优点。', 
 
        'url'           =>  'https://www.imiphp.com', 
 
    ]; 
 
    $a = new B($constructData); 
 
    test('B clone', function() use($a){ 
 
        for($i = 0; $i < TEST_COUNT; ++$i) 
 
        { 
 
            $obj = clone $a; 
 
        } 
 
    }); 
 
    test('B new', function() use($a){ 
 
        for($i = 0; $i < TEST_COUNT; ++$i) 
 
        { 
 
            $obj = new B($a->data); 
 
        } 
 
    }); 
 
    $serialize = serialize($a); 
 
    test('B unserialize', function() use($serialize){ 
 
        for($i = 0; $i < TEST_COUNT; ++$i) 
 
        { 
 
            $obj = unserialize($serialize); 
//Cuoxin.com 
        } 
 
    }); 
 
}  
 
test2(); 
运行结果

空的类:

A clone time: 0.0015249252319336s

A new time: 0.00090503692626953s

A unserialize time: 0.005108118057251s

带构造方法、属性的类:

B clone time: 0.00072503089904785s

B new time: 0.0015559196472168s

B unserialize time: 0.0084571838378906s

 

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章