Clone et new ne doivent pas être comparés ensemble. Leurs fonctions sont différentes. Mais il peut y avoir certains scénarios dans lesquels un clone ou un nouveau peut être utilisé, alors lequel devrions-nous choisir à ce stade ?
J'ai écrit deux tests, le premier consiste à déclarer une classe vide et le second est une classe avec des constructeurs et des attributs. De plus, j'ai également ajouté des tests de sérialisation PHP.
Pratique internationale, entrez directement le code, c'est clair en un coup d'œil.
Code
<?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); } }); } test2();
Exécuter le résultat
Classe vide :
A clone time: 0.0015249252319336s A new time: 0.00090503692626953s A unserialize time: 0.005108118057251s
Classe avec constructeur et attributs :
B clone time: 0.00072503089904785s B new time: 0.0015559196472168s B unserialize time: 0.0084571838378906s
Conclusion
À en juger par les résultats des tests de la classe vide, le nouveau a des performances plus élevées.
À en juger par les résultats des tests des classes avec méthodes et attributs de construction, les performances du clone sont bien supérieures à celles du nouveau avec les paramètres de construction.
La sérialisation a comme toujours des performances médiocres, alors ne l'utilisez pas si vous ne pouvez pas l'utiliser.
Donc, nous devrions utiliser le clonage là où nous le devrions, et les performances ne sont pas mauvaises.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!