La tête dans le Flux !

RSS

Requêtes, parallélisation et mobiles

En 2009, Steve Souders, un expert dans le domaine de la performance web, avait annoncé qu’il ne fallait pas utiliser @import pour appeler ses feuilles de styles CSS.

L’explication est simple : plusieurs fichiers CSS appelés via <link> peuvent être “parallélisés”, c’est à dire chargés en même temps; ce qui n’est pas le cas de fichiers appelés via @import : les styles sont chargés un par un.

Il est bien entendu possible d’utiliser @import de façon pertinente, mais pour des raisons de facilité et de performances, il est devenu conventionnel de se limiter aux appels de styles via <link>.

Mais ça, c’était avant… la propagation du Web sur smartphones et tablettes.

En effet, il semble que tous les navigateurs mobiles ne soient pas sur un même pied d’égalité en ce qui concerne la gestion intelligente des requêtes et des ressources. Grâce à une discussion intéressante avec Simon Boudrias, j’ai procédé à quelques tests de performances mobile, et ma conclusion personnelle est assez édifiante.

Présentation et principe du test

L’idée générale est d’observer comment sont chargées (ou non) différentes feuilles de styles dédiées testant une page HTML dans l’outil en ligne de Blaze.io/mobile, qui semble unanimement pertinent.

Dans tous les cas, les 4 feuilles CSS sont appelées via <link> dans le <head> du document.

<link href="styles.css" media="screen">
<link href="print.css" media="print">
<link href="tv.css" media="tv">
<link href="mobile.css" media="screen and (max-width:800px)">

Observation 1 : Safari mobile est un cancre

Résultat du test sur iPhone 4

performances de chargement sur iPhone4

Résultat du test sur iPad 2

performances de chargement sur iPad 2

Que ce soit sur iPhone ou iPad, Safari mobile ne semble pas gérer les téléchargements simultanés : les fichiers de styles sont chargés l’un après l’autre et le navigateur attend que le dernier soit chargé avant de poursuivre le chargement de toutes les autres ressources de la page !

La page a mis 2.86s a être intégralement chargée sur iPhone et 1.94s a être intégralement chargée sur iPad.

Observation 2 : d’autres navigateurs mobiles s’en sortent mieux

Résultat du test sur Android 3

performances de chargement sur Android 3

Résultat du test sur Android 2.3

performances de chargement sur Android 2.3

La page a mis 0.55s a être intégralement chargée sur Android 3, et 1.21s sur Android 2.3.

La solution réside-t-elle dans l’unification ?

Puisque Safari ne gère pas correctement la parallélisation des chargements, voyons quel est le résultat en regroupant tous les fichiers de styles en un seul fichier CSS unique.

Résultat du test (CSS unique) sur iPhone 4

performances avec feuille CSS unique

La page de test contenant une feuille de style unifiée a mis 1.95s a être intégralement chargée sur iPhone 4, soit près d’une seconde de différence pour une page de moins 2ko !

Il paraît donc évident que le nombre de requêtes (en tout cas pour certains navigateurs) a une incidence non négligeable sur le délai d’affichage des sites sur mobiles.

Résultat du test (CSS unique et minifié) sur iPhone 4

performances avec feuille CSS unique et minifiée

Dans ce dernier test, j’ai poussé jusqu’à minifier au maximum la taille du fichier CSS unique à l’aide de CleanCSS. Le fichier a ainsi été réduit de 45%, mais la différence de performance n’est pas flagrante : la page a mis 1.8s a être intégralement chargée sur iPhone 4.

Nous sommes encore loin des performances d’affichage sur Android, mais on a fait ce qu’on a pu :)

Je pense qu’il y a encore beaucoup à dire sur ce sujet brûlant… et ça tombe bien, la discussion est ouverte. N’hésitez pas à laisser vos commentaires, vos avis et tests personnels.