par
Genova » 19 juil. 2007, 15:31
Si tu regardes mon code Sekil tu verras que justement il illustre le fait que serialize() ne les garde pas. Ce qui est logique au fond puisque serialize() transforme quelque chose d'abstrait en une chaîne de caractère, il serait par conséquent illogique de garder les références sur des données volatiles comme les variables qui disparaissent en fin de script.
Alors la différence entre new et clone en terme de performance, j'ai fait un benchmark :
(100000 itérations)
Code : Tout sélectionner
class A
{
public $titi = array('toto', 'tutu', 'tyty');
private $test = 'salut';
}
$a = new A; // 0.18666601181
$b = clone $a; // 0.0804181098938
Code : Tout sélectionner
class A
{
public $titi = array('toto', 'tutu', 'tyty');
private $test = 'salut';
public function __clone()
{
}
}
$a = new A; // 0.182492017746
$b = clone $a; // 0.171550989151
Code : Tout sélectionner
class A
{
public $titi = array('toto', 'tutu', 'tyty');
private $test = 'salut';
public function __construct()
{
}
public function __destruct()
{
}
}
$a = new A; // 0.308668851852
$b = clone $a; // 0.144464969635
Code : Tout sélectionner
class A
{
public $titi = array('toto', 'tutu', 'tyty');
private $test = 'salut';
public function __construct()
{
}
public function __destruct()
{
}
public function __clone()
{
}
}
$a = new A; // 0.314460992813
$b = clone $a; // 0.230401039124
J'ai aussi essayé en mettant un tableau de 100000 éléments dans la propriété $titi, ça ne change rien.
En conclusion cloner semble plus rapide qu'instancier, mais à mon avis c'est une mauvaise idée car :
- l'optimisation est très faible (insignifiante, a moins de manipuler une collection de 100000 objets dans ta page ...)
- ce ne serait pas spécialement du point de vu du fonctionnement du langage et du lecteur du code
Si tu regardes mon code Sekil tu verras que justement il illustre le fait que serialize() ne les garde pas. Ce qui est logique au fond puisque serialize() transforme quelque chose d'abstrait en une chaîne de caractère, il serait par conséquent illogique de garder les références sur des données volatiles comme les variables qui disparaissent en fin de script.
Alors la différence entre new et clone en terme de performance, j'ai fait un benchmark :
(100000 itérations)
[code]class A
{
public $titi = array('toto', 'tutu', 'tyty');
private $test = 'salut';
}
$a = new A; // 0.18666601181
$b = clone $a; // 0.0804181098938[/code]
[code]class A
{
public $titi = array('toto', 'tutu', 'tyty');
private $test = 'salut';
public function __clone()
{
}
}
$a = new A; // 0.182492017746
$b = clone $a; // 0.171550989151[/code]
[code]class A
{
public $titi = array('toto', 'tutu', 'tyty');
private $test = 'salut';
public function __construct()
{
}
public function __destruct()
{
}
}
$a = new A; // 0.308668851852
$b = clone $a; // 0.144464969635[/code]
[code]class A
{
public $titi = array('toto', 'tutu', 'tyty');
private $test = 'salut';
public function __construct()
{
}
public function __destruct()
{
}
public function __clone()
{
}
}
$a = new A; // 0.314460992813
$b = clone $a; // 0.230401039124[/code]
J'ai aussi essayé en mettant un tableau de 100000 éléments dans la propriété $titi, ça ne change rien.
En conclusion cloner semble plus rapide qu'instancier, mais à mon avis c'est une mauvaise idée car :
- l'optimisation est très faible (insignifiante, a moins de manipuler une collection de 100000 objets dans ta page ...)
- ce ne serait pas spécialement du point de vu du fonctionnement du langage et du lecteur du code