Temps de rendu CSS et poids d'affichage de la page

Introduction

Si vous êtes du genre à vous tenir informé du fonctionnement des navigateurs, vous savez déjà qu'il y a eu récemment des articles incroyables détaillant le fonctionnement du rendu/composite accéléré par GPU de Chrome. Tout d'abord, Rendu accéléré dans Chrome : le modèle de calques est une excellente introduction à la façon dont Chrome utilise le concept de calques pour dessiner sa page. Pour en savoir plus, Compositing accéléré par GPU dans Chrome explique comment Chrome utilise ces calques, ainsi que le GPU pour afficher votre page.

La question philosophique

Après avoir passé beaucoup de temps à écrire des rastériseurs logiciels pour la 3D, il est devenu évident pour moi que certaines propriétés CSS devraient avoir des performances variables lors du dessin de votre page. Par exemple, la rastérisation d'une petite image à l'écran est une opération algorithmique complètement différente du dessin d'une ombre portée sur une forme arbitraire. La question suivante s'est donc posée : Quel est l'impact des différentes propriétés CSS sur le poids de rendu de votre page ?

Mon objectif était de catégoriser un grand nombre de propriétés/valeurs CSS en fonction de leurs temps de peinture afin de comprendre quels types de propriétés CSS sont plus performants que d'autres. Pour ce faire, j'ai écrit un peu d'automatisation avec du ruban adhésif et de la gomme à bulles pour essayer d'ajouter une visibilité numérique aux temps de peinture CSS, qui fonctionnait comme suit :

  • Générez une suite de pages HTML individuelles, chacune avec un seul élément DOM associé à certaines permutations de propriétés CSS.
  • Exécutez un script d'automatisation qui, pour chaque page, va :
    • Lancez Chrome.
    • Charger une page
    • Générer une image Skia pour la page
    • Exécutez chaque image Skia prise via Skia Benchmark pour obtenir les temps
  • Exportez tous les temps et admirez les chiffres. (Cette partie est importante…)

Avec cette configuration, nous générons une suite de pages HTML, où chaque page contient une permutation unique de propriétés et de valeurs CSS. Par exemple, voici deux fichiers HTML :

<style>
#example1 {
    background: url(foo.png) top left / 50% 60%;
    padding: 20px; 
    margin-top: 10px;
    margin-right: 20px; 
    text-align: center;
}
</style>
<div id="example1">WOAH</div>

Et une autre, plus complexe

<style>
#example1 {
    background-color:#eee;
    box-shadow: 1px 2px 3px 4px black;
    border-radius: 50%;
    background: radial-gradient(circle closest-corner, white, black);
    padding: 20px; 
    margin-top: 10px;
    margin-right: 20px; 
    text-align: center;
}
</style>
<div id="example1">WOAH</div>

Vous trouverez ci-dessous une variante du dernier exemple, où nous ne modifions que la valeur du dégradé radial :

<style>
#example1 
{
    background-color:#eee;
    box-shadow: 1px 2px 3px 4px black;
    border-radius: 50%;
    background: radial-gradient(farthest-side, white, black);
    padding: 20px; 
    margin-top: 10px;
    margin-right: 20px; 
    text-align: center;
}
</style>
<div id="example1" style="padding: 20px; margin-top: 10px;margin-right: 20px; text-align: center;">WOAH</div>

Chaque page est ensuite chargée dans une instance fraîche de Chrome (pour s'assurer que les délais n'ont pas été biaisés par des états obsolètes lors des rechargements de page) et une image Skia (*.SKP) est utilisée pour évaluer les commandes Skia utilisées pour peindre la page. Une fois que les fichiers SKP ont été générés pour chaque fichier HTML, nous exécutons un autre lot pour transférer les fichiers *.SKP via l'application Skia Benchmark (créée à partir du code source de Skia), qui indique le temps moyen nécessaire pour afficher cette page.

Évaluer les données

Nous pouvons maintenant représenter de manière approximative le temps de peinture d'une suite de propriétés CSS. Ou plutôt, nous pouvons commencer à classer les propriétés CSS en fonction de leurs performances de peinture. Voici un grand graphique réalisé avec la version bêta de Chrome 27, qui présente l'ensemble complet des données de chronométrage de ce processus. Notez que toutes les données sont susceptibles d'évoluer, car Chrome devient de plus en plus rapide au fil du temps.

Délais pour toutes les permutations du test

Chaque barre verticale représente le temps de peinture d'une page avec une seule combinaison de propriétés CSS (agrandie de 100 fois ; la valeur à l'échelle réelle de ce graphique est de 0,156 ms). De nombreuses jolies lignes, mais sous cette forme, elles sont quelque peu inutiles. Nous devons effectuer une analyse de données pour trouver des tendances utiles.

Tout d'abord, nous constatons que certaines propriétés CSS sont tout simplement plus coûteuses à afficher que d'autres. Par exemple, dessiner une ombre portée sur un élément DOM implique une opération en plusieurs passes avec des splines et d'autres éléments indésirables, contrairement à l'opacité, qui devrait être plus facile à afficher.

Temps nécessaire pour peindre un élément qui ne comporte qu&#39;une seule propriété CSS

Deuxièmement, et plus intéressant encore, les combinaisons de propriétés CSS peuvent avoir un temps de peinture supérieur à la somme de leurs parties. Du point de vue d'un observateur, cela semble un peu étrange. Nous nous attendons à ce que A+B = C, et non 2,2 C. Par exemple, pour ajouter box-shadow et border-radius-stroke :

Délais pour toutes les permutations du test

Ce qui est très intéressant à ce sujet, c'est qu'il ne s'agit pas seulement de la propriété box-shadow, mais aussi de cette permutation de valeur spécifique. Par exemple, ci-dessous est présenté un regroupement de box-shadow : 50% et border-radius avec des variations de valeur.

Délais de toutes les permutations du test

D'après les données, cela dure depuis un certain temps. Il existe de nombreuses combinaisons étranges que ma suite de tests ne touche presque pas toutes. Il existe encore des tonnes de tests et de combinaisons qui pourraient produire des résultats intéressants.

Trouver la valeur de votre page "render-weight"

Grâce à la possibilité de suivre les temps de rendu de chaque élément de votre page, les développeurs peuvent commencer à évaluer leur poids de rendu de page et son impact sur la réactivité de votre site. Voici quelques conseils pour vous lancer.

  1. Utilisez le mode de peinture continue de Chrome dans les outils pour les développeurs Chrome pour comprendre quelles propriétés CSS vous coûtent le plus.
  2. Intégrez des examens CSS à votre processus d'examen du code existant pour détecter les problèmes de performances. Recherchez les éléments de votre CSS qui sont connus pour être plus coûteux, comme les dégradés et les ombres. Demandez-vous si vous avez vraiment besoin de ces éléments ici.
  3. En cas de doute, privilégiez toujours les performances. Vos utilisateurs ne se souviendront peut-être pas de la largeur de la marge intérieure de vos colonnes, mais ils se souviendront de l'expérience qu'ils ont vécue sur votre site.

Conclusion

L'un des aspects les plus intéressants de cette expérience est que le calendrier ne cesse de changer à chaque version de Chrome (nous espérons qu'elle sera plus rapide). Ce qui est lent aujourd'hui peut être rapide demain. Vous pouvez retenir de cet article que vous devez éviter de placer box-shadow: 1px 2px 3px 4px sur un élément qui possède déjà border-radius:5. Cependant, la conclusion la plus importante à retenir est que les propriétés CSS ont un impact direct sur les temps de peinture de la page.

Références