|
|
|
|
TUTORIEL PHP |
|
|
|
Optimiser vos applications PHP |
La popularité grandissante du Web met une pression croissante sur les logiciels et le matériel utilisé pour les applications. Cet article va vous donner les tuyaux pour réduire la charge de vos serveurs, et augmenter la capacité de vos applications sans avoir à vous ruiner en mises à jour matérielles.
(30/03/2004) |
|
(fourni
par )
Avant de commencer notre quête vers la performance, je tiens
à vous mettre en garde. Donner plus de rapidité à votre application
est certainement un objectif noble, mais malheureusement cela
demandera souvent un certain investissement en temps, et nous
exposera fréquemment à des bogues. Il est très important que
vous ne vous lanciez pas dans l'optimisation prématurée de votre
application, car cela vous mènera certainement à l'échec, aussi
bien au niveau de la tenue des délais que de la probabilité
d'aboutir à un programme fonctionnel.
N'optimisez vos applications que lorsque le code a été écrit
complètement, testé, et jugé convenable. Définissez toujours
le niveau de performances que vous cherchez à atteindre. Sans
objectif précis, vous pourriez passer votre vie à optimiser
sans y arriver : car il y aura toujours des trucs et des mises
au point supplémentaires que vous pourrez appliquer.
Maintenant que nous nous sommes débarrassés des mises en garde
habituelles au sujet de l'optimisation, venons-en à la partie
passionnante : le travail lui-même. Vous pouvez certainement
gagner une augmentation de performance significative en optimisant
votre code PHP, mais c'est souvent un type d'optimisation qu'il
vaut mieux garder pour la fin, quand toutes les autres options
ont été épuisées. Optimiser un script peut se révéler être un
processus sans fin et il y a toujours le risque d'endommager
votre code. Autant que possible, il vaut mieux optimiser ce
qui aura un impact positif sur les performances de vos applications,
mais en dehors de votre code. Comme vous le devinez sûrement,
cet article s'intéresse aux optimisations qui n'ont pas besoin
de modification de code, et qui permettent à vos applications
PHP de s'exécuter plus rapidement.
Pour
commencer
La première étape consiste à optimiser l'exécutable PHP lui-même,
ce qui permettra aux scripts qu'il exécute de se dérouler plus
rapidement. Ceci peut être fait en exigeant plus de votre compilateur
C, comme gcc, lors de la compilation de PHP et en configurant
l'exécutable binaire qui sera généré pour des performances maximales.
Cette optimisation se fait en spécifiant différentes options
de configuration au compilateur, via la variable d'environnement
CFLAGS. Cette variable est utilisée par le script de configuration,
qui passe ensuite ces valeurs au compilateur au moment de la
construction. Il est important de noter que, même si je ne mentionne
ces options que dans le contexte de PHP, ces indicateurs d'optimisation
sont applicables à toutes les parties du système d'exploitation
et plus le système est rapide, plus il sera capable de rapidement
exécuter tout, y compris vos applications PHP. Ci-dessous se
trouve un exemple d'une procédure de compilation PHP modifiée.
export CFLAGS="-O3 -msse -mmmx -march=pentium3
\
-mcpu=pentium3 -mfpmath=sse -funroll-loops"
./configure
make
make install
Que font ces options ? La première, -O3,
indique au compilateur quel niveau d'optimisation utiliser.
Normalement, PHP n'utilise que -O2,
qui est considéré comme étant sûr, sachant que trop d'optimisation
peut engendrer des problèmes de stabilité. Ceci dit, étant donné
l'évolution des compilateurs, -O3
est, par expérience, tout aussi sûr, et beaucoup de projets
l'ont déjà adopté comme leur niveau d'optimisation par défaut.
La différence principale entre les deux est que -O3
autorise l'inclusion par référence de fonctions, ce qui permet
au compilateur d'optimiser des fonctions en remplaçant des appels
de fonction par une copie de leur code. Une autre technique
d'optimisation qui est activée avec -O3,
est le "recyclage de registre" qui permet au compilateur
de profiter de registres inutilisés pour des tâches diverses.
Cela est très pratique sur les processeurs modernes avec de
nombreux registres qui sont souvent inutilisés.
L'inconvénient de -O3 est qu'il
rend le code généré presque impossible à déboguer car le réarrangement
du registre crée une situation où un backtrace ne peut pas être
généré, en cas de crash du programme. Cependant, comme vous
devriez pas rencontrer de crash, et c'est donc une option dont
vous pouvez vous passer facilement.
Dans notre commande de compilation ci-dessus, nous avons un
groupe d'options qui indiquent au compilateur des détails sur
le processeur et ses caractéristiques. Cela permet au compilateur
d'appliquer différentes optimisations qui sont spécifiques au
processeur (un Pentium III dans notre cas). Cela ne se fait
généralement pas lors de la production d'exécutables binaires,
car le but est alors de rendre le programme exécutable sur de
nombreux environnements. Mais si nous travaillons uniquement
pour notre serveur, alors nous n'avons pas cette contrainte,
et pouvons profiter des avantages spécifiques de notre architecture.
Bien sûr, permettre un ciblage spécifique au CPU implique que
la portabilité du binaire généré sera limitée à un seul type
de processeur. Par exemple, du code taillé pour le Pentium III
via les options -march et -mcpu ne fonctionnera pas sur des
Pentiums plus anciens ni sur des processeurs AMD. Si vous compilez
PHP pour une ferme de serveurs qui utilise plusieurs types de
processeurs, vous pourriez ne pas avoir envie d'utiliser des
options : elles vous obligeraient à compiler un exécutable PHP
différent pour chaque type de processeur.
Les trois autres options -msse,
-mmmx et -mfpmath=sse
indiquent que mon processeur est compatible avec ces groupes
d'extensions et spécifient au compilateur qu'il devrait essayer
de les utiliser pour générer un code optimal. SSE et MMX sont
initialement des groupes d'instructions mathématiques et leur
utilisation peut accélérer de manière significative toute opération
mathématique que le code C sous-jacent a besoin de réaliser.
La dernière option que je cite -funroll-loops,indique au compilateur
qu'il doit développer les petites boucles. La conséquence est
la réduction du nombre d'instructions que le processeur doit
traiter, car il n'y a plus ou peu de boucles. Cependant, le
programme résultant sera un peu plus gros, vu que le code sera
répété dans le source autant de fois que nécessaire.
|
|
|
|
|
|