<?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; clonenode</title>
	<atom:link href="http://performance.survol.fr/avec/clonenode/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>Lenteur du DOM</title>
		<link>http://performance.survol.fr/2009/03/lenteur-du-dom/</link>
		<comments>http://performance.survol.fr/2009/03/lenteur-du-dom/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 11:00:59 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[clonenode]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[domfragment]]></category>
		<category><![CDATA[fragment]]></category>
		<category><![CDATA[innerHTML]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[reflow]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=440</guid>
		<description><![CDATA[De nombreux sites dits &#171;&#160;web 2,0&#8243; utilisent javascript à outrance. Leur performance tient généralement à la bonne ou la mauvaise utilisation de javascript. Aujourd&#8217;hui nous pouvons parler du DOM, et l&#8217;accès au DOM est lent : évitez le. Accès DOM &#8230; <a href="http://performance.survol.fr/2009/03/lenteur-du-dom/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>De nombreux sites dits &laquo;&nbsp;web 2,0&#8243; utilisent javascript à outrance. Leur performance tient généralement à la bonne ou la mauvaise utilisation de javascript. Aujourd&#8217;hui nous pouvons parler du DOM, et l&#8217;accès au DOM est lent : évitez le.<span id="more-440"></span></p>
<h3>Accès DOM</h3>
<p><a href="http://www.coachwei.com/blog/_archives/2008/1/22/3480119.html">La première étude</a> vient de Dijitalife. L&#8217;auteur a comparé le temps nécessaire à l&#8217;exécution d&#8217;une fonction vide, et comparé avec différent types d&#8217;opération. La lecture complète est recommandée. On s&#8217;y attend, manipuler un élément prend forcément plus de temps qu&#8217;exécuter une fonction vide. Certains temps sont toutefois surprenants.</p>
<p>En comparant la lecture d&#8217;un attribut sur un objet javascript et la lecture de l&#8217;attribut &laquo;&nbsp;id&nbsp;&raquo; sur un élément DOM via <code>getAttribute()</code>, on repère facilement le problème. On est six fois plus lent sur Internet Explorer 7, quatorze fois plus lent sur Firefox 3, et deux fois plus lent sur Safari 3. Quatorze ? le chiffre est énorme pour une information aussi simple que l&#8217;identifiant d&#8217;un élément déjà récupéré. Même en comparant par rapport à la lecture d&#8217;un attribut d&#8217;objet javascript via un getter, on reste sept fois plus lent sous Firefox 3 (alors que sous Safari, lire dans le DOM ou dans un objet js via un getter est aussi rapide). Je vous invite à lire le tableau de résultats chiffré sur Dijitalife.</p>
<p>Alors voilà : l&#8217;accès au DOM est lent, un peu sous Internet Explorer, beaucoup sous Firefox.</p>
<p>Étonnamment, sur ce même Firefox 3.0 qui met longtemps à lire un attribut DOM, récupérer tous les éléments d&#8217;un certain type ou l&#8217;élément d&#8217;un certain identifiant est rapide (2,5 fois plus que la lecture de l&#8217;identifiant dans l&#8217;objet DOM ainsi récupéré), sous Internet Explorer 7 elle l&#8217;est beaucoup moins (3 à 5 fois plus lent que la lecture de l&#8217;identifiant dans l&#8217;objet DOM récupéré). Je soupçonne Firefox 3 d&#8217;utiliser l&#8217;index pour la recherche mais de ne pas importer les différents attributs et valeurs de l&#8217;objet avant d&#8217;en avoir besoin.</p>
<h3>Manipulations de l&#8217;arbre DOM</h3>
<p>Dans tous les navigateurs, la modification du DOM, que ce soit par <code>innerHTML</code> ou <code>createTextNode</code> est lente, mais on s&#8217;y attendait. Par contre, changer la valeur <code>className</code> d&#8217;un élément est aussi lent que l&#8217;utilisation de <code>innerHTML</code> sur Internet Explorer 7 ou Safari 3. Pour Firefox 3 c&#8217;est toujours lent, mais bien moins qu&#8217;un <code>innerHTML</code> (5 fois plus rapide exactement).</p>
<h3>Premières conclusions</h3>
<p>Qu&#8217;en tirer ? en fait la comparaison entre navigateurs n&#8217;apporte pas grand chose par elle-même puisqu&#8217;il faut accepter de développer pour tous les navigateurs. De plus, Firefox et Internet Explorer n&#8217;ayant pas leur force et leur faiblesse au même endroit pour ce qui est des performances DOM, je serai bien à mal de dire qui a fait le bon choix sans faire des tests (attention toutefois, on parle de performance relative à une opération étalon pour chaque navigateur, même si la performance relative d&#8217;Internet Explorer par rapport à son étalon est meilleure, en valeur absolue Firefox reste plus rapide dans tous les cas ou presque).</p>
<p>Par contre il est clair que l&#8217;accès au DOM est lent, même en lecture sur de simples attributs. On peut en tirer une recommandation simple&nbsp;:<strong> mettez en cache les lectures d&#8217;attribut DOM, ne les répétez pas à chaque utilisation</strong>.</p>
<p>Jquery a d&#8217;ailleurs <a href="http://docs.jquery.com/Internals/jQuery.data">un Datastore</a> pour éviter ça. Quand vous stockez des informations sur un élément, au lieu d&#8217;ajouter des attributs directement dans le DOM (avec toute la lenteur associée), on utilise le <code>datastore</code>. Conceptuellement c&#8217;est juste un attribut unique pour chaque élement DOM, et un dictionnaire qui associe ce que vous voulez stocker avec cet identifiant unique.</p>
<h3>Créer ou modifier une structure DOM complexe</h3>
<p><a href="http://ejohn.org/blog/dom-documentfragments">La seconde info</a> vient de John Resig. Il nous rappelle la présence des objets <code>DocumentFragment</code> dans les navigateurs modernes (et même d&#8217;autres puisque Internet Explorer 6 supporte cette fonctionnalité). il s&#8217;agit d&#8217;un espace temporaire, hors du document, où on peut manipuler le DOM, créer des éléments, les supprimer, les déplacer.</p>
<p>John a fait quelques tests, et créer une structure DOM complexe dans un fragment pour la cloner ensuite dans le document réel est bien plus efficace que la créer directement dans le document. On a un gain de performance de 2 à 3. Bien entendu c&#8217;est valable si vous souhaitez créer toute une structure, pas un seul noeud.</p>
<p>Sean sullivan <a href="http://www.ryboe.com/2008/07/22/increasing-appendchild-performance-with-dom-tricks.html">en parle aussi</a>, avec des graphiques explicites.</p>
<p>Plus généralement,</p>
<ul>
<li><strong>utiliser <code>cloneNode</code> </strong>est bien plus rapide que recréer à chaque fois des éléments.</li>
<li><strong>créer une structure dans un fragment ou</strong> <strong>au moins dans un élément détac</strong><strong>hé de la page </strong>jusqu&#8217;au dernier moment sera plus rapide que d&#8217;ajouter un à un des éléments dans un bloc déjà affichable</li>
<li><strong>utiliser <code>innerHTML</code> </strong>sera plus rapide que de créer une structure DOM si vous ne réutilisez pas cette structure ensuite (<a href="http://www.julienlecomte.net/blog/2007/12/38/">attention aux fuites de mémoire et aux événements</a>)</li>
<li><strong>modifier des éléments invisibles</strong> (<strong><code>display:none</code></strong> par exemple) impactera moins les performance (pas de <a href="http://performance.survol.fr/avec/reflow/">reflow</a>)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2009/03/lenteur-du-dom/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
