<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Performance web &#187; Dave Hyatt</title>
	<atom:link href="http://performance.survol.fr/avec/dave-hyatt/feed/" rel="self" type="application/rss+xml" />
	<link>http://performance.survol.fr</link>
	<description>Quelques mots pour des sites web rapides</description>
	<lastBuildDate>Fri, 18 Jun 2010 12:47:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Performance des sélecteurs CSS, encore un mot</title>
		<link>http://performance.survol.fr/2008/10/performance-des-selecteurs-css-encore-un-mot/</link>
		<comments>http://performance.survol.fr/2008/10/performance-des-selecteurs-css-encore-un-mot/#comments</comments>
		<pubDate>Fri, 17 Oct 2008 10:00:05 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[Dave Hyatt]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[Jon Sykes]]></category>
		<category><![CDATA[Microsoft Internet Explorer]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[safari]]></category>
		<category><![CDATA[sélecteur]]></category>
		<category><![CDATA[style]]></category>
		<category><![CDATA[webkit]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=252</guid>
		<description><![CDATA[On reparle des performances CSS. Souvenez-vous, je vous avais parlé d&#8217;un document de Mozilla faisant état des sélecteurs plus ou moins performants. S&#8217;était ensuivi une discussion à propos de la pertinence de tels sujets vu la différence de performance mise &#8230; <a href="http://performance.survol.fr/2008/10/performance-des-selecteurs-css-encore-un-mot/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>On reparle des performances CSS. Souvenez-vous, <a href="http://performance.survol.fr/2008/05/performance-des-selecteurs-css/">je vous avais parlé d&#8217;un document de Mozilla</a> faisant état des sélecteurs plus ou moins performants. S&#8217;était ensuivi <a href="http://performance.survol.fr/2008/05/gains-de-performance-des-selecteurs-css/">une discussion à propos de la pertinence de tels sujets</a> vu la différence de performance mise en oeuvre.</p>
<p>Je vous invite à relire ce second billet, qui résume assez bien. Si on remet le couvert c&#8217;est que Jon Sykes a refait <a href="http://jon.sykes.me/153/more-css-performance-testing-pt-3">un troisième test</a> tout récemment, avec un graphique assez sympa</p>
<p><span id="more-252"></span></p>
<p>Plutôt que les valeurs absolues des performances ce qui est intéressant c&#8217;est l&#8217;évolution suivant le type de sélecteur utilisé. Safari et Microsoft Internet Explorer sont très dépendant du sélecteur, Firefox un peu moins. Allez voir les graphiques, ça vaut milles lignes d&#8217;explication.</p>
<p>Bref, si vous deviez retenir quelque chose :</p>
<ul>
<li>Faites attention aux sélecteurs enfant et descendant (mais pas au point de tenter de les éviter) ;</li>
<li>Tentez d&#8217;utiliser des sélecteurs très simples, par exemple juste un nom de classe (mais pas la peine de reprendre vos CSS pour ça) ;</li>
<li>N&#8217;ajoutez pas de hiérarchie de balises en préfixe de vos sélecteurs en pensant aider le navigateur (c&#8217;est le contraire qui se passe) ;</li>
<li>L&#8217;impact de tout cela sera  nul sur des pages simples ou même moyennes, cela peut commencer à avoir du sens sur des grosses applications HTML comme on commence à en voir (c&#8217;est Dave Hyatt qui le dit, faites lui confiance) ;</li>
<li>Les navigateurs ne réagissent pas tous pareil vis à vis de la complexité des sélecteur, Firefox semble optimiser ses recherches différemment.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2008/10/performance-des-selecteurs-css-encore-un-mot/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Gains de performance des sélecteurs CSS</title>
		<link>http://performance.survol.fr/2008/05/gains-de-performance-des-selecteurs-css/</link>
		<comments>http://performance.survol.fr/2008/05/gains-de-performance-des-selecteurs-css/#comments</comments>
		<pubDate>Mon, 12 May 2008 18:45:18 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[Dave Hyatt]]></category>
		<category><![CDATA[Jim Barrau]]></category>
		<category><![CDATA[Jon Sykes]]></category>
		<category><![CDATA[sélecteur]]></category>
		<category><![CDATA[style]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=31</guid>
		<description><![CDATA[Je parlais il y a quelques jours de performance des sélecteurs CSS. Il y a eu quelques réactions et j&#8217;ai échoué dans mes explications : les différences de performance dont on parle ici sont probablement négligeables la plupart du temps. &#8230; <a href="http://performance.survol.fr/2008/05/gains-de-performance-des-selecteurs-css/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Je parlais il y a quelques jours de <a href="http://performance.survol.fr/2008/05/performance-des-selecteurs-css/">performance des sélecteurs <acronym title="cascading style sheet">CSS</acronym></a>. Il y a eu quelques réactions et j&#8217;ai échoué dans mes explications : les différences de performance dont on parle ici sont probablement négligeables la plupart du temps. Hors commentaires, certains m&#8217;ont rappelé que la documentation de Mozilla concerne d&#8217;ailleurs au départ les interfaces <acronym title="xml user interface language">XUL</acronym> avec de gros documents <acronym title="extensible markup langage">XML</acronym> complexes agrémentés de très grosses feuilles de style.</p>
<h3>Quelle importance ?</h3>
<p>Il n&#8217;y a pas lieu de refaire vos CSS ou de commencer à mettre en place des solutions qui handicapent la maintenance du site (par exemple ne plus utiliser aucun sélecteur descendant). Il y a toutefois parfois utilité. Sur de grosses pages spéciales ou simplement sur les gros sites, ça peut avoir une influence.<span id="more-26"></span> Je pense en particulier à la philosophie du « on ajoute les nouvelles règles, on modifie parfois, mais on ne supprime pas » qui prévaut sur certains gros sites, par peur de casser quelque chose ou parce que le site est trop gros pour garantir qu&#8217;on ne casse rien.  Là il est peut être possible de gagner une centaine de millisecondes ou deux. On ne changera pas la feuille de style mais connaître les motifs qui posent problème permet éventuellement d&#8217;anticiper et d&#8217;écrire autant que possible quelque chose de performant. Ca ne fera de toutes façons pas de mal.</p>
<h3>Où on précise ce qui doit l&#8217;être</h3>
<p>Tout ceci est confirmé par quelques unes de mes lectures récentes. J&#8217;aurai préféré les intégrer dans les billet précédent mais les liens de départ viennent seulement de sauter dans mon aggrégateur <acronym title="really simple syndication">RSS</acronym>.  Dans l&#8217;ordre chronologique c&#8217;est <a href="http://www.shauninman.com/archive/2008/05/05/css_qualified_selectors#comment_3942">Dave Hyatt qui répond à une proposition d&#8217;évolution de CSS</a> (commentaire 37). Il explique le fonctionnement interne des navigateurs pour tracker les règles applicables et les continuer à appliquer vos CSS malgré les changements dans le <acronym title="document object model">DOM</acronym>. Le tout rejoint ce que j&#8217;avais retenu du document de Mozilla. En même temps c&#8217;est logique car c&#8217;est le même auteur, et lui l&#8217;explique bien mieux que moi.</p>
<h3>Et ce qu&#8217;il faut en conclure</h3>
<p>C&#8217;est Jim Barraud qui en sort <a href="http://jimbarraud.com/2008/05/07/css-inefficiency/">la conclusion que j&#8217;aurai bien aimé écrire</a>. Pas de chance pour moi, j&#8217;ai toujours voulu en écrire des tartines en cherchant tous les détails quand seule la conclusion est primordiale. Tel qu&#8217;il faut le lire : <strong>intuitivement on peut penser que spécifier l&#8217;ascendance des balises ou préciser des détails comme le nom de la balise peut aider le navigateur, en réalité c&#8217;est le contraire</strong>. Relisez cette phrase, c&#8217;est l&#8217;unique d&#8217;importance. Tout le billet précédent est composé de détails de moindre importance pour ceux qui sont aussi curieux que moi.</p>
<h3>Pour ceux qui veulent des chiffres</h3>
<p>JP Sykes a lui tenté de mesurer le gain de performance concret. Je n&#8217;ai pas eu le courage de le faire, prévoyant des résultats peu concluants. Avec <a href="http://jpsykes.com/151/testing-css-performance">son premier essai</a> il a été dans l&#8217;impossibilité de distinguer une quelconque différence. Il lui a fallu faire <a href="http://jpsykes.com/152/testing-css-performance-pt-2">un second essai</a> avec tableau de 20.000 cellules bourré d&#8217;identifiants et de classes, avec autant de déclarations de style (donc une par cellule) pour trouver des différences significatives. Avec ces tests peu représentatifs on arrive enfin à des différences jusqu&#8217;à 60% (pour Safari 3) qui représentent plus d&#8217;une seconde.  Si on considère les performances comme linéaires par rapport au nombre de sélecteur et par rapport au nombre de cellules, un document HTML plus raisonnable (environ l&#8217;équivalent de 50&#215;20 cellules) la différence de performance dépasse à peine les 10ms. Bref, intéressant à connaître mais certainement pas le point le plus important.</p>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2008/05/gains-de-performance-des-selecteurs-css/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Performance des sélecteurs CSS</title>
		<link>http://performance.survol.fr/2008/05/performance-des-selecteurs-css/</link>
		<comments>http://performance.survol.fr/2008/05/performance-des-selecteurs-css/#comments</comments>
		<pubDate>Mon, 05 May 2008 11:01:01 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[Dave Hyatt]]></category>
		<category><![CDATA[gecko]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[rendu]]></category>
		<category><![CDATA[sélecteur]]></category>
		<category><![CDATA[style]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=29</guid>
		<description><![CDATA[Nous avons peu d&#8217;informations officielles de la part des navigateurs sur les performances de leurs moteurs. Le Mozilla Developer Center nous propose tout de même une courte page sur comment écrire des feuilles de style efficaces. Dans ce billet j&#8217;appellerai &#8230; <a href="http://performance.survol.fr/2008/05/performance-des-selecteurs-css/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Nous avons peu d&#8217;informations officielles de la part des navigateurs sur les performances de leurs moteurs. Le <a href="http://developer.mozilla.org/">Mozilla Developer Center</a> nous propose tout de même une courte page sur <a href="http://developer.mozilla.org/en/docs/Writing_Efficient_CSS">comment écrire des feuilles de style efficaces</a>.</p>
<p>Dans ce billet j&#8217;appellerai critère une partie de sélecteur qui contient un identifiant, une classe, un nom de balise ou <code>*</code> (par exemple : <code>#back</code>, <code>*:link</code>, <code>.selected</code>, <code>input[type="text"]</code>, ou <code>ul.menu</code>). Les directives de l&#8217;article de Mozilla peuvent être regroupées en quatre groupes :</p>
<ul>
<li>n&#8217;utilisez pas de critère universel ;</li>
<li>dans un critère utilisez un identifiant, une classe ou un nom de balise mais pas une combinaison de deux ou trois ;</li>
<li>limitez le nombre de critères dans vos sélecteurs ;</li>
<li>profitez de la cascade en appliquant les règles le plus haut possible.<span id="more-24"></span></li>
</ul>
<h3>Comment ça marche</h3>
<p>L&#8217;article de Mozilla donne une bonne idée des optimisations du moteur Gecko : le navigateur construit certainement un index pour les noms de balise, les identifiants et les noms de class. Si on utilise un nom de classe, un nom de balise ou un identifiant comme critère le plus à droite, Gecko peut aller rechercher ça dans son index puis après vérifier le reste du sélecteur, de droite à gauche. L&#8217;objectif est de savoir si un sélecteur s&#8217;applique, uniquement à partir d&#8217;une rapide recherche dans les index, sans avoir à analyser le noeud <acronym title="document object model">DOM</acronym> pour récupérer ses autres informations.</p>
<p>Mozilla nous donne même la priorité : Gecko vérifie en priorité les identifiants, puis s&#8217;il n&#8217;y en a pas il vérifie les noms de classe, sinon il vérifie le nom de la balise, et enfin, si on ne se raccroche à rien, on doit vérifier le sélecteur pour chaque noeud du document.</p>
<h3>N&#8217;utilisez pas de critère universel</h3>
<p>De là vient la première règle : un critère à droite qui n&#8217;utilise ni identifiant, ni nom de classe, ni nom de balise, alors il faut parcourir tout le DOM et vérifier le sélecteur sur chaque noeud. Intuitivement on s&#8217;attend à ce que ça soit lent, et visiblement ça se vérifie dans le moteur. Fini donc les <code>:link</code> et <code>[type="text"]</code>, ça sera <code>a:link</code> et <code>input[type="text"]</code>.</p>
<h3>Identifiant, classe ou balise, pas de cumul</h3>
<p>La seconde règle est aussi induite par le processus de Gecko. Si je spécifie un identifiant et un nom de balise (par exemple <code>ul#menu</code>), Gecko ira chercher l&#8217;identifiant dans son index. Pour vérifier que le sélecteur correspond il devra aller chercher le noeud DOM puis comparer le nom de la balise. Au lieu d&#8217;aider le navigateur on va lui demander plus de calcul. La réaction est similaire si je fais un <code>ul.menu</code> ou un <code>#menu.selected</code>. Identifiant, nom de classe ou nom de balise, mais un seul des trois, et dans cet ordre de préférence. À la place d&#8217;un <code>ul.menu</code>, il vaudrait mieux faire un <code>.menu-list</code>. Certes on perd en généricité mais on demande moins de travail au moteur.</p>
<h3>Limitez le nombre de critères</h3>
<p>Plus on multiplie les critères plus le moteur doit faire d&#8217;analyse via le DOM en plus de la recherche dans son index. Autant que possible, l&#8217;identifiant ou le nom de la classe doit être spécifique et ne pas se reposer sur la hiérarchie. Ainsi, Mozilla recommande un <code>.menu-item</code> plutôt qu&#8217;un <code>.menu li</code> pour cibler les items d&#8217;un menu sous forme de liste. Si vous devez utiliser la hiérarchie et que vous le pouvez (rapport à la compatibilité <acronym title="Microsoft Internet Explorer">MSIE</acronym> 6), toutefois, préférez le sélecteur enfant (signe &laquo;&nbsp;supérieur à&nbsp;&raquo;) au sélecteur descendant (simple espace).</p>
<h3>Profitez de la cascade</h3>
<p>Enfin, et c&#8217;est là une optimisation qui ne coûte pas cher, appliquez vos styles au noeud le plus générique possible. Pour exemple la couleur de texte et le style des puces peuvent être appliqués directement sur la liste elle même au lieu d&#8217;être appliqués sur chaque item de la liste indépendamment. C&#8217;est valable pour une bonne partie des styles, justement à cause de l&#8217;aspect &laquo;&nbsp;cascade&nbsp;&raquo; de nos feuilles de style.</p>
<h3>Et le reste ?</h3>
<p>Il y a une dernière recommandation concernant les images sous forme de sprites, mais c&#8217;est en utilisant une règle propriétaire à Mozilla, et j&#8217;ai prévu un billet dédié sur le sujet.</p>
<p>Il y a aussi des choses que j&#8217;ai cherché mais pas trouvé, que ce soit sur <acronym title="Microsoft developper network">MSDN</acronym>, le site développeur de Mozilla ou ceux de Opera et Safari : l&#8217;influence que les performances de rendu des positions, flottants, marges négatives, tableaux dynamiques et autres méthodes de stylage. Parfois on ressent réellement que telle ou telle page est lourde à cause du montage <acronym>CSS</acronym>, et une connaissance de ce est particulièrement coûteux serait plus qu&#8217;intéressant. Si parmi mes fidèles cinq lecteurs, l&#8217;un de vous a dans son stock un lien sur le sujet, je le remercie de le partager.</p>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2008/05/performance-des-selecteurs-css/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>
