Bonjour à tous,
En faisant un benchmark perso pour tester les performances entre un passage par copie et un passage par référence en PHP, je me suis trouvé face à une bizarrerie intéressante.
Ma configuration actuelle est :
1 2
| PHP Version 5.3.9-ZS5.6.0
Zend Framework Version 1.11.11 |
J'ai fais un premier test de cette forme :
1 2 3 4 5 6 7 8 9 10
|
$tab1 = array_fill(0, 1000000, 'e');
$time_start = microtime(true);
$tab2 = $tab1;
$time_end = microtime(true);
$time = $time_end - $time_start;
echo 'Durée : '.$time.' secondes<br/>'; |
Et à ma grande surprise, j'ai obtenu :
Durée : 5.0067901611328E-6 secondes
quand la création du premier tableau prenait :
Durée : 0.14926791191101 secondes
C'était comme si par défaut $tab2 était une référence de $tab1.
Alors j'ai décidé de modifier $tab1 et de regarder $tab2 pour voir si il était modifié également.
Code :
1 2 3 4 5 6 7 8 9 10 11 12
|
$tab1 = array_fill(0, 1000000, 'e');
$time_start = microtime(true);
$tab2 = $tab1;
$tab1[14] = 'j';
$time_end = microtime(true);
$time = $time_end - $time_start;
echo 'Durée : '.$time.' secondes<br/>';
echo $tab2[14]; |
Et là, résultat :
1 2 3
|
Durée : 0.093044996261597 secondes
e |
En commentant la ligne $tab1[14] = 'j';, je reviens à :
Durée : 2.1457672119141E-6 secondes
C'est une optimisation cachée, que je trouve intéressante. J'aimerais savoir si c'est un mécanisme connu, défini par le langage, ou un mécanisme lié au moteur PHP de Zend ?
Si je comprend bien, une affection d'un tableau est faite par référence tant que les deux tableaux restent constants ?
Partager