PHP performance tips, l'article de Google qui fait scandale

Google a fait couler beaucoup d'encre ses derniers jours avec cet article qui propose quelques astuces pour améliorer les performances des scripts PHP. Plusieurs experts de PHP ont réagit assez vivement pour critiquer certaines recommandations qui n'ont aucun sens pour eux.

En tous cas, c'est un bon prétexte pour examiner en détail certains aspects du langage PHP.

Copy-on-write ou copie à l'écriture

Depuis la version 4 de PHP, la copie de variable se fait par référence. C'est à dire qu'on ne copie pas les données contenues dans la variable quand on fait une assignation, mais on affecte simplement un nouveau nom à la variable. Pour connaitre le nombre de référence d'une variable, on peut utiliser la fonction <?phpdebug_zval_dump?> :

<?php
$a 
'abc';
debug_zval_dump($a); // Affiche string(3) "abc" refcount(2)
$b $a;
debug_zval_dump($a); // Affiche string(3) "abc" refcount(3)
$b .= 'def';
debug_zval_dump($a); // Affiche string(3) "abc" refcount(2)
?>

Comme on le voie, l'assignation <?php$b = $a?> entraine la création d'une référence, qui est ensuite détruite lorsqu'on modifie la variable <?php$b?>.

Le passage de la variable à la fonction <?phpdebug_zval_dump?> entraine la création d'une référence, ce qui explique qu'on a la valeur 2 pour le premier appel (on s'attendrait à avoir 1).

Donc quand on a une variable <?php$a?> contenant beaucoup de données comme une très longue chaine de caractères par exemple, faire <?php$b = $a?> n'entraine pas la duplication des données. On crée simplement un nouvel alias dans la table des symboles PHP. Ca prend un peu de mémoire, ça pollue un peu plus la table des symboles, mais ça n'a pas d'impact significatif sur les performances du script.

Cette astuce n'a donc d'intérêt que si vous travaillez avec une version de PHP antérieure à PHP 4.

On le voit dans cet exemple, l'optimisation n'est pas une affaire simple. Il faut connaitre toutes les optimisations utilisées en interne par le moteur de script pour savoir si une modification est pertinente ou pas. Si on ajoute à ça les caches, les subtilités des gestionnaires de mémoire, le matériel, on comprends que ce n'est pas évident, même pour un webmaster de chez Google !

Voir aussi

Etiquettes:

Commentaires

J'ai particulièrement été surpris par cette vidéo qui m'a beaucoup fait rire. Les optimisations présentées n'ont que peu de sens et n'apportent pas réellement de gain notable à échelle humaine dans un script PHP. Par contre, ce qui m'a surtout déçu, c'est de voir du code obsolète avec des mysql_query() et mysql_fetch_array() qui n'ont plus lieu d'exister et d'être utilisées depuis l'arrivée de PDO en PHP 5.1.

Note pour Google au passage, le mysql_fetch_array() est plus lent qu'un mysql_fetch_assoc()...

Ajouter un commentaire