Comparaison des performances du clone et du nouveau en PHP (exemple de code)

藏色散人
Libérer: 2023-04-06 13:36:02
avant
3964 Les gens l'ont consulté

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(&#39;TEST_COUNT&#39;, 10000);
  
function test($name, $callable)
{
    $time = microtime(true);
    $callable();
    echo $name, &#39; time: &#39;, microtime(true) - $time, &#39;s&#39;, PHP_EOL;
}
// 空的类 
class A
{
     
} 
function test1()
{
    echo &#39;空的类:&#39;, PHP_EOL;
    $a = new A;
    test(&#39;A clone&#39;, function() use($a){
        for($i = 0; $i < TEST_COUNT; ++$i)
        {
            $obj = clone $a;
        }
    });
    test(&#39;A new&#39;, function(){
        for($i = 0; $i < TEST_COUNT; ++$i)
        {
            $obj = new A;
        }
    });
    $serialize = serialize($a);
    test(&#39;A unserialize&#39;, 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 &#39;带构造方法、属性的类:&#39;, PHP_EOL;
    $constructData = [
        &#39;id&#39;            =>  1,
        &#39;name&#39;          =>  &#39;imi 框架牛逼&#39;,
        &#39;description&#39;   =>  &#39;IMI 是一款基于 Swoole 开发的协程 PHP 开发框架,拥有常驻内存、协程异步非阻塞IO等优点。&#39;,
        &#39;url&#39;           =>  &#39;https://www.imiphp.com&#39;,
    ];
    $a = new B($constructData);
    test(&#39;B clone&#39;, function() use($a){
        for($i = 0; $i < TEST_COUNT; ++$i)
        {
            $obj = clone $a;
        }
    });
    test(&#39;B new&#39;, function() use($a){
        for($i = 0; $i < TEST_COUNT; ++$i)
        {
            $obj = new B($a->data);
        }
    });
    $serialize = serialize($a);
    test(&#39;B unserialize&#39;, function() use($serialize){
        for($i = 0; $i < TEST_COUNT; ++$i)
        {
            $obj = unserialize($serialize);
        }
    });
} 
test2();
Copier après la connexion

Exécuter le résultat

Classe vide :

A clone time: 0.0015249252319336s
A new time: 0.00090503692626953s
A unserialize time: 0.005108118057251s
Copier après la connexion

Classe avec constructeur et attributs :

B clone time: 0.00072503089904785s
B new time: 0.0015559196472168s
B unserialize time: 0.0084571838378906s
Copier après la connexion

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!

Étiquettes associées:
source:yurunsoft.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal