getter et setter

Les getter et setter dans PHP5 sont des outils très utiles. Malheureusement, à force de trop les utiliser, ils parviennent à rapidement plomber l'efficacité d'un code qui est pourtant simple.

Zend Framework, ici, n'échappe pas à la règle. Une solution simple pour éviter les contre-performances des classes comme Zend_Config ou Zend_Db_Table est de faire attention de ne pas abuser de la petite flèche vers la droite (->) et surtout pas dans des boucles.

On constate que rapidement, en bouclant sur un résultat de requête, par exemple, 20% du temps est pris simplement par les tests et la copie des données dans le getter.

La solution est évidemment d'utiliser des tableaux standards. La fonction toArray() règle le problème dans la plupart des cas.

partial

Le helper partial, quel bonheur ! On inclut un bout de code au milieu d'un autre bout de code et on peut le réutiliser partout. Oui, mais non...

Ce helper a la facheuse tendance de dupliquer la vue et énormément de code. Cette duplication a bien entendu un coût d'exécution. En le positionnant au milieu d'une boucle, la fuite de performance est inévitable.

Préférez encore l'utilisation du vieux include pour insérer votre code, quitte à déclarer les variables nécessaires avant son appel. Et ceci, surtout si vous vous trouvez dans un code récurrent.

Zend Date et Zend Locale

On en a déjà parlé dans un précédent billet. Zend_Date et Zend_Locale sont des gouffres à mémoire. Malheureusement, il s'avère que ce n'est pas leur unique problème.

A l'instanciation d'une classe utilisant Zend_Locale, une multitude de fichiers XML sont chargés en mémoire, prenant d'un seul coup quelques mégas. Ceux-ci contiennent les détails sur l'affichage des dates, heures et devises. Bien entendu, ceci a un coût au niveau du temps de chargement.

Il faut utiliser ces classes avec parcimonie. Surtout, éviter les instanciations multiples dans des boucles, comme toujours. Et si vraiment les performances sont trop mauvaises, n'hésitez pas à utiliser les bonnes vieilles fonctions PHP.

Conclusion

Zend Framework nous offre des outils mais leur philosophie n'a pas l'air d'être la performance. Malheureusement pour nous, il va falloir utiliser ces classes avec attention.

En optimisant un tout petit peu son code, on arrive à des gains de performances énormes, de l'ordre de 50 à 60% de temps d'exécution économisé. Donc ça en vaut largement la chandelle !

Vous pouvez facilement analyser les performances de votre code en suivant le petit tutoriel à disposition ici.

Suite à quelques expériences, j'ai de gros doute sur les performances de Zend_Application et également le générateur de CAPTCHA de Zend. Mais n'ayant pas pu faire de plus amples tests, j'évite de m'étendre là dessus pour l'instant.

Connaissez-vous d'autres gouffres à performance ? N'hésitez pas à en faire part... :)

Mise à jour: j'ai publié un exemple d'optimisation de Zend Framework en espérant que ça vous sera utile.