Blog Haypo

Aller au contenu | Aller au menu | Aller à la recherche

mardi 19 février 2008

Profiling PHP et Javascript

Lorsqu'on cherche à accélérer une application, on a besoin d'outils pour en mesurer les performances : isoler les fonctions les plus lentes et suivre l'évolution des performances. La méthode la plus simple est de sauver une estampille de temps au début et à la fin de l'opération testée, puis de calculer la différence en répétant la mesure pour la fiabiliser. Cette méthode est loude à utiliser car il faut modifier le code source. Je vais vous présenter des outils plus simples pour PHP et Javascript.

PHP : Xdebug

L'outillage PHP est rare et de piètre qualité. Néanmoins, je suis tombé sur XDebug qui, pour une fois, semble d'excellente facture. Ce projet est un extension PHP au moteur Zend qui permet de mesurer les performances d'un script PHP, d'analyser la couverture de code, ou encore de déboguer interactivement un script.

Pour compiler le projet sous Linux, vous aurez besoin de l'outil phpize qui va générer le script configure. Cet outil fait parti du paquet Ubuntu php5-dev. Bizzarement, Ubuntu (/usr/lib/command-not-found) ne propose pas d'installer le paquet php5-dev quand on tente d'exécuter phpize. Incapable de corriger le problème, j'ai ouvert un rapport de bug.

Une fois le module installé (./configure && make && sudo make install), il faut l'activer en ajoutant une option zend_extension à PHP. Sous Ubuntu, il suffit de créer un fichier /etc/php5/conf.d/xdebug.ini avec le contenu suivant (adaptez le chemin si besoin est) :

# configuration for php Xdebug module
zend_extension="/usr/lib/php5/20060613+lfs/xdebug.so"
xdebug.profiler_enable=1

Maintenant, pour chaque hit sur une page PHP, un fichier /tmp/cachegrind.out.pid sera généré. Les résultats peuvent manipulés avec l'excellent KCacheGrind. Un des graphiques les plus utiles est l'arbre ci-dessous :

Note : Pour l'installation, je me suis aidé du guide Installer Xdebug pour PHP 5.2.

Javascript : Venkman et Firebug

Pour profiler Javascript, là encore, il y a peu d'outils. J'ai testé le débogueur Javascript Venkman dans Firefox. Malheureusement, j'ai rapidement été confronté à un bug Firefox : Venkman crashs on profiling after clearing profile data. J'ai perdu beaucoup de temps à isoler ce bug avec gdb et Valgrind. Et dire qu'un rapport de profiling Venkman est une longue page HTML incompréhensible...

J'ai perdu tellement de temps sur Venkman que je ne me suis pas aperçu que j'avais déjà la solution sous les yeux ! L'excellente extension Firebug contient déjà des outils de profiling Javascript. Pour profiler une page, activez Firebug, cliquez sur le bouton « Profile » (c'était vraiment sous mon nez), chargez la page à tester, puis recliquez sur « Profile ». Vous obtiendez un joli tableau synthétique où on peut changer la méthode de tri dynamiquement. Voir le tableau (tronqué) ci-dessous :

Note : Je n'ai pas eu le temps de tester Drosera qui est le profiler Javascript de WebKit.

Mots de la fin

Pour finir, petit rappel : une optimisation n'est profitable que lorsqu'on gagne plus de 5% (voir 20%). Parfois, un changement sera une légère accélération sur une machine, et un léger ralentissement sur une autre. Les micro-optimisations sont à bannir. Souvent, un algorithme qui convenait à de petites quantités de données se révèle avoir une complexité en O(n^2) voir O(n^3) et effondre les performances. Il faut alors changer d'algorithme. Autre méthode : limiter les appels aux fonctions lentes, en utilisant un cache par exemple.

Le fournisseur d'accès à Internet Free

Depuis Octobre 2006, je suis abonné au fournisseur d'accès Internet Free. Situé à 900 mètres du DSLAM, l'affaiblissement de ma ligne (ADSL 2+) est de 13 dB. Le téléphone (VoIP) fonctionne plutôt bien et la télévision également : je peux enregistrer une émission tout en regardant un film. L'appel à l'international est gratuit dans de nombreux pays et bon marché pour les autres. Note : l'appel aux États-Unis est gratuit... mais pas pour l'Alaska (qui un état des États-Unis) !? L'appel en Alaska coûte 22 centimes la minute (tiens, je vois dans la grille tarifaire que l'appel en Alaska est aussi noté comme gratuit !?).

Employé en télétravail, la stabilité de ma connexion Internet est primordiale. De mémoire, en 17 mois, j'ai du avoir à peu près 30 minutes d'interruptions de services (plus d'internet du tout). Ce qui donne une fiabilité de 99,996%. Début 2007, la télévision était parfois hors-service, mais ça n'arrive plus aujourd'hui. J'ai choisi le mode PATATE de l'option Fastpath : « synchronisation ADSL sans bridage (jusqu'à 24 Mbit/sec) et sans seuil minimum sur le bruit, mais peut entraîner des erreurs et des pertes de paquets ».

Fin novembre dernier, le code source du site grenouille.com est passé sous licence AGPLv3. J'en ai profité pour m'inscrire à ce service : consultez mes graphiques de vitesse de téléchargement. La vitesse de téléchargement varie entre 800 et 1200 Ko/sec, la vitesse d'envoi semble bridée à 100,0 Ko/sec et le ping est d'environ 35 ms.

C'est vraiment très agréable d'avoir une aussi grosse bande passante avec une si bonne fiabilité. Pour finir, je paie 29,99€ en tout pour Internet, la télévision et le téléphone.

Note : Le support Free est difficilement joignable et totalement incompétent. Si vous avez le moindre problème avec votre connexion, c'est la croix et la bannière... Free est plutôt binaire : soit ça marche (bien), soit ça marche pas (du tout).