Performances d'un site web
Par Jean-Sébastien Mansart - 22 commentaires
Depuis quelques mois je m'intéresse à deux points particuliers d'un site web : l'accessibilité et les performances.
Les performances web ne sont pas combien de visiteurs un site web a réussi à convertir en acheteur, mais plutôt la rapidité de réponse et d'affichage d'un site dans le navigateur de l'internaute.
Dans le domaine des performances web, en français, il n'existe pas beaucoup de lecture sur internet. Cependant deux blogs traitent du sujet.
Le premier est celui d'Eric Daspet : Performances web, et le second, celui de Nicole Sullivan.
Je lis celui d'Eric Daspet depuis plusieurs mois, et quand j'ai le temps, je me penche d'un peu plus près sur les conseils qu'il donne et regarde ce que je peux mettre en place de mon coté.
Pourquoi se préoccuper des performances des sites web ?
C'est vrai après tout, tout le monde a une connexion de ouf...
Tout le monde ? Pas forcément. Et des fois, tout se joue pour quelques centaines de millisecondes.
Perdre 500ms c’est perdre 20% de traffic pour Google (ou pourquoi il n’y a que dix résultats par page dans les recherches).
Perdre 100ms c’est perdre 1% de ventes pour Amazon.
Réduire de 25% le poids de la page c’est gagner 25% d’utilisateurs à moyen terme pour Google.
Eric Daspet - A quoi ça sert ?
Pour un petit blog comme le mien, ce n'est rien, je n'ai pas un besoin vital de me préoccuper de cet aspect.
Non.
Je m'en sers comme "bac à sable". Je peux tester certaines pratiques, certaines techniques, afin de voir comment les intégrer dans mon travail, les partager avec mes collègues et leur faire comprendre que c'est un point tout aussi important que l'accessibilité ou que la couleur du bouton que veut le client.
Que peut-on faire facilement ?
Dans un premier temps, j'ai donc installé YSlow, un plugin pour firefox qui vient en surcouche de firebug.
YSlow m'a donné un petit D, soit 58 sur 100. Et mon site se chargeait en 3 secondes.
J'ai regardé point par point ce que je pouvais faire, et après avoir lu de la doc un peu partout, j'ai commencé par réduire le poids des images.
Pour ça, il existe un site web fabuleux, créé par Nicole Sullivan et Stoyan Stefanov : smushit. Il suffit de donner l'url de la page, et le service s'occupe de tout. Au final il vous rend un fichier zip avec toutes les images optimisées et, point important, les optimisations ne sont pas destructives. Votre image sera identique pixel par pixel à celle d'origine.
J'ai ensuite tenté de réduire le nombre de requêtes HTTP.
Pour réduire le nombre de requêtes HTTP, on peut :
- merger les CSS
- merger les JS
- privilégier les CSS Sprites
Je n'ai pas été très chanceux sur ce coup, je voulais à tout prix faire un maximum de CSS Sprites, mais dans mon cas, ce n'était pas possible, je n'ai réussi qu'à réduire d'une image le nombre d'images CSS.
J'ai tout de même réussi à merger les trois feuilles de styles pour n'en faire plus qu'une seule, et je l'ai ensuite optimisée avec code beautifier.
Pour les fichiers JavaScript, rien à faire de ce côté là, utilisant dotclear, je préfère laisser les fichiers JS tels quels.
En troisième action, j'ai demandé à mon hébergeur de configurer le mod_expires d'apache.
mod_expires permet de spécifier une date d'expiration du contenu. Tant que la date n'aura pas expirée, votre navigateur ne rechargera pas le contenu en question. Les gains en cache plein sont assez impressionnants.
Vous pouvez régler la date d'expiration par type de contenu, et vous pouvez le faire soit dans la configuration générale d'apache, soit dans votre vhost ou votre .htacess.
Voici par exemple ce que j'utilise :
ExpiresActive on
ExpiresDefault access plus 10 years
ExpiresByType text/html now
ExpiresByType text/xml now
On active le mode expires, par défaut tous les types de contenus expirent dans 10 ans, par contre, le HTML et le XML expirent immédiatement, ce qui évite de vider son cache quand un nouvel article est publié sur le site et sur le flux RSS par exemple.
Au final, avec ces quelques petites choses, avec un cache vide, mon site (d'après mes tests) se charge en 1s, et avec le cache plein en 0,5s. Ce qui me fait maintenant une note C, soit 79 sur 100.
On remarquera aussi qu'avec le cache vide, 26 requêtes sont nécessaires, alors qu'une fois le cache plein, il ne suffit plus que d'une seule requête : la page HTML.
Prochainement, avec mon hébergeur, nous devrions mettre en place le mod_gzip qui permet de compresser à la volée le contenu, et ainsi réduire la consommation en bande passante et, normalement, accélérer l'affichage des pages. Car plus c'est gros, plus c'est lent.
Tout ce travail porte ses fruits, j'ai déjà commencé à modifier la configuration apache de nos serveurs de production, et les graphistes regardent de près smushit et le format PNG-8 qui est beaucoup plus performant que le GIF.
Les performances web, c'est comme l'accessibilité, toujours en mouvement. On n'est jamais fixé, il y a toujours à faire, c'est pour ça que j'aime le web !
A suivre donc...


Commentaires
Très instructif ce post. Je vais regarder de plus près ce que tu dis !
bien vu JS !
Professionnellement, j'utilise Jawr (Java) pour compresser les fichiers JS/CSS, ainsi que les sprites pour réduire les requêtes HTTP !
Très bon article.
Ce serait d'ailleurs intéressant de savoir quelle démarche qualité vous intégrez quand vous développez un site web : accessibilité, performances, respect des standards, etc...
Où en êtes-vous ?
On en a déjà parlé avec JS mais je pense que l'utilisation du mod_gzip sur un blog comme celui-ci ne vas pas forcément se voir beaucoup. Comme JS l'a expliqué, ce mod permet de faire des économies de bande passante en compressant les contenus du site web avant de les envoyer au navigateur.
Etant donné la capacité du serveur d'hosting qui est sous-utilisée en termes de bande passante (Environ 200 ko/s de moyenne sur un mois) et les capacités de connexions clientes, le gain va vraiment être minime et pas forcément visible.
Cependant, dans certains cas précis le gain peut être intéressant comme par exemple les connexions clientes à faible débit telles que les liens satellites (Même s'il est possible de faire du 60 Mbits/s descendant avec des mécanismes d'accélération mais ça coute vraiment très cher) ou bien pour réduire les couts de bande passante sur les grosses infrastructures comme par exemple chez Yahoo qui semble utiliser de tels procédés.
Donc à utiliser très certainement mais dans certains cas uniquement pour vraiment voir le gain.
PS : Non JS ce n'est pas pour me dérober à mes obligations d'activation de mod_gzip :D
Plein de pistes intéressantes à suivre :)
Hopla direct dans les Marques-ta-page !
Il existe des systèmes de cache tel que eAccelerator ou APC qui permettent un gain non négligable sur la génération des pages PHP.
Il est également intéressant de s'orienter vers des systèmes de caches permettant à apache de servir des pages statiques prégénérées plutôt que de systématiquement générer toutes les pages (typiquement au lieu de servir un .php on peut servir un .html correspond au résultat du .php quelques minutes ou heures auparavant - une page statique est bien plus rapide à servir qu'une page dynamique :p)
J'ajouterais au commentaire d'olivier sur le mod_gzip qu'il n faut pas oublier qu'il est consommateur en CPU, donc peu recommandé pour des sites à fort traffic.
Enfin, il ne faut surtout pas oublier qu'un bon site dynamique passe par un code optimisé ;)
@benny : en fait, il y a deux façons d'accélérer un site. Soit sur la partie back-office. Améliorer les requêtes, faire des index, mettre un système de cache comme squid, faire du load-balancing, etc... Mais si ton front-end est tout pourrit, tu aura beau avoir une architecture serveur du feu de dieu, il faudra toujours que le navigateur client fasse les 90 requêtes HTTP, télécharger à chaque fois, tous les composants de la page, être bloqué par des javascript et télécharger en tout 2Mo de données pour chaque page.
Je pense qu'il peut être intéressant d'optimiser ça :)
Un petit truc sur un blog: réduire le nombre d'articles sur ta HomePage et utilisez "lire la suite"; en plus ça oblige les gens à cliquer ;-)
J'ai écris un billet un peu dans ce sens (plus une poignée de pistes 'serveur' a explorer que des recettes toutes faites) récemment.
mod_gzip est devenu mod_deflate d'ailleurs, je sais que certaines affectionnent leur Apache 1.3 mais bon, la 2.0 et 2.2 sont là depuis un petit moment quand même :-)
J'attends avec impatience un module de mem_cache "stable" (dans le sens mettable en prod) :-)
Article très intéressant.
Un seul point me laisse très très sceptique : les sites web de réduction du poids des images, comme smush.it que tu cites.
En effet je ne crois pas aux miracles, et il me parait donc impossible de réduire le poids des images en ne modifiant aucun pixels de l'image d'origine (sauf si on a mis des images BMP bien sur...)
D'ailleurs la phrase "Smushit.com is a service that goes beyond the limitations of Photoshop, Fireworks & Co." me parait assez incroyable... Smushit aurait inventé un algorithme meilleur qu'Adobe a lui tout seul ?! Je suis pas convaincu.
Pour moi forcement leur optimisation est destructive. Ce qui n'est d'ailleurs pas forcement un mal, mais il faut le savoir.
@Julien : j'utilise apache 2, donc merci pour la précision du changement de nom :)
@quiz : j'étais comme toi, au début, très septique. J'ai donc testé le service. Sur certaines images, j'ai gagné 3%, sur d'autres 20%, et sur quelques unes 80%. Les images étaient en GIF ou JPEG. Le principal changement est l'utilisation du PNG-8 par smushit. Et non, ils n'ont pas UN meilleurs algorithme qu'Adobe, mais ils utilisent une cinquantaines d'algorithmes, ils les appliquent tous, et prennent le meilleur résultat.
Après, certes, si tu utilise déjà la fonction "enregistrer pour le web" et que tu utilise le format PNG-8, smushit ne t'aidera pas énormément...
OK on est complètement d'accord en fait donc...
Et n'oublions pas de rappeler que le PNG est incompatible avec IE6 (encore très utilisé en entreprise). Donc à utiliser en connaissance de cause, selon le public du site web etc...
quiz : non, je crois qu'on est pas totalement d'accord :) Les optimisations des images sont totalements non destructives, les images avant et après optimisation sont identiques au pixel.
Par contre, pour ce qui est de la compatibilité des PNG avec IE6, il me semble que ce n'est "que" la transparence qu'IE6 ne gère pas.
Si si je t'assure on est d'accord ! ;)
Dans le sens ou ce que je veux dire c'est qu'il n'y a aucun sites "miracles" pour réduire le poids des images.
Mais si il s'agit simplement d'un choix du meilleur algo selon les images alors dans ce cas la pourquoi pas.
Je trouve simplement un peu trompeur leur texte de présentation mais bon...
Et pour le PNG sur IE6 oui tu as raison il y a seulement la transparence qui n'est pas gérée. Je crois même qu'il y a des astuces de CSS pour passer outre mais relativement lourdes à mettre en place).
@quiz:
lourdes, ou plus simples mais avec plein de problèmes, pertes d'alignements bg etc... ... je pense n'avoir jamais trouvé la lib idéale, light, sans pixel.gif ou autres bricoles immondes... bref, des boîtes qui utilisent IE6 et veulent une appli peuvent aussi se passer de la beauté naturelle du PNG... on fait pas de confiture dans une casserole, nah! ( :-) petite envie de me rebiffer contre IE6 en ce moment :-) )
Merci pour le lien vers "code beautifier", je ne connaissais pas et je trouve ça vraiment sympa :D
Ce n'est que le PNG-24 et ses transparences partielles que IE6 ne gère pas, pour le PNG-8, pas de souci ;-)
Un article bien intéressant en tout cas ^^
@Olivier/5: La bande passante de ton serveur n'est pas le seul critère. Si tu n'utilises pas de cache, c'est le client qui va le plus en souffrir. C'est lui qu'il faut aussi et surtout accélerer.
@quiz/15: il n'y a jamais aucun miracle, mais tenter de tester plusieurs stratégies de compression, retirer les méta données, ce sont des choses à faire et à tester. Pas magique mais par rapport à ce qu'on trouve sur la plupart des sites, on peut souvent gagner 10% et et pas mal de poids.
Smushit n'est pas destructif, l'image est la même au pixel près. Par contre smushit (ou plutot PNGcrush qui est derrière) fait plus de choses que Photoshop. Peut être d'ailleurs en partie parce que l'application de photoshop n'est pas vraiment la publication web.
Photoshop est très mauvais en PNG, même avec un "sauver pour le web" d'ailleurs (on peut encore gagner après en passant par PNGcrush ou optipng). La légende voudrait que ce soit volontaire, pour valoriser leur support GIF pour lequel ils ont payé la licence à Unisys. Probablement plus parce que simplement ce n'a jamais été leur priorité. Même Fireworks (même éditeur) gère un peu mieux les PNG. Photoshop est un des softs qui donne les plus mauvaises images PNG en terme de poids ou de fonctionnalités.
@Eric : On est d'accord. De mon côté je parlais essentiellement des problèmes de bande passante côté serveur vu que c'est le côté que je connais le plus. Je parle juste un peu du côté client en évoquant les connexions satellitaires avec des débits faibles. Même si l'on a des moyens d'accélerer et d'optimiser les connexions au niveau HTTP/TCP et IP grâce à des logiciels dédiés pour, c'est quand même bien de pouvoir réduire les temps de téléchargement sur ces connexions à faible débit.
Mais cette argumentation ne couvre effectivement que le critère de la bande passante. Après côté client il faut prendre en compte d'autres aspects je pense tels que les perfomances du système client utilisé (CPU, perfos du navigateur par exemple) pour obtenir l'objectif qui est que l'utilisateur voit le resultat le plus rapidement possible.
A ce propos, je me suis rappelé de mes cours d'IHM ou on m'avait énnoncé un postulat qu'un utilisateur ne peut attendre plus de 3 secondes un résultat après avoir exécuté une action. Est ce quelque chose pris en compte sous cette forme ou une autre dans le cadre des développements WEB pour faire une application optimisée et performante ?
Si tu as des références pour ton cours d'IHM ça m'intéresse.
Mais oui, ça fait partie des choses qu'on tente d'imposer. Malheureusement la question des performances côté client est encore fortement méconnue ou sous estimée. On arrive avec des chiffres empiriques basés sur des expériences.
J'avais commis http://performance.survol.fr/2008/0... en reprenant les chiffres d'Akamai (qui mettent le palier vers 4 secondes), mais on voit les dégats en terme de ventes et de trafic dès qu'on augmente de quelques centaines de millisecondes, même sans approcher les 4 secondes au total.
Très intéressant comme post. Il est vrai que la rapidité d'un site fait beaucoup dans le plaisir que l'on a de le lire et le visiter, mais surtout d'y revenir. J'ai essayé smushit, et il ne me propose que 3 à 4% de taill économisée, ce qui fait que c'es très négligeable et donc pas forcément utile. Tout dépend en fait de l'éditeur de photo que l'on a et du degré de compression que l'on met dans la transition jpeg.