<?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; Nicholas Zakas</title>
	<atom:link href="http://performance.survol.fr/avec/nicholas-zakas/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>Améliorer le code javascript</title>
		<link>http://performance.survol.fr/2009/07/ameliorer-le-code-javascript/</link>
		<comments>http://performance.survol.fr/2009/07/ameliorer-le-code-javascript/#comments</comments>
		<pubDate>Thu, 09 Jul 2009 10:00:17 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[boucle]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[domfragment]]></category>
		<category><![CDATA[fragment]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Nicholas Zakas]]></category>
		<category><![CDATA[portée]]></category>
		<category><![CDATA[reflow]]></category>
		<category><![CDATA[repaint]]></category>
		<category><![CDATA[style]]></category>
		<category><![CDATA[variables]]></category>
		<category><![CDATA[velocity]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=653</guid>
		<description><![CDATA[Malgré le rappel de Douglas Crockford sur le fait que le code javascript lui-même représente au mieux 15% des performances de la page, il est parfois utile d&#8217;y jeter un oeil. Nicholas Zakas, de Yahoo!, propose un bon aperçu pour &#8230; <a href="http://performance.survol.fr/2009/07/ameliorer-le-code-javascript/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Malgré le rappel de Douglas Crockford sur le fait que le code javascript lui-même représente au mieux 15% des performances de la page, il est parfois utile d&#8217;y jeter un oeil.</p>
<p>Nicholas Zakas, de Yahoo!, propose un bon aperçu pour ceux que ça intéresse dans sa présentation <a href="http://en.oreilly.com/velocity2009/public/schedule/detail/7510">&laquo;&nbsp;Writing Efficient javascript&nbsp;&raquo; aux conférences Velocity 2009</a>.</p>
<h3>Variables locales</h3>
<p>Vous y trouverez un rappel sur <a href="http://performance.survol.fr/2008/05/portee-des-variables-javascript/">l&#8217;influence de la chaîne de résolution des variables javascript</a> avec un raccourci très significatif : local variable = fast. Le graphique à l&#8217;écran 26 est parfait pour expliquer tout ça :</p>
<p><a href="http://performance.survol.fr/wp-content/uploads/2009/06/Picture-3.png"><img class="aligncenter size-medium wp-image-654" title="Influence de la portée des variables en javascript" src="http://performance.survol.fr/wp-content/uploads/2009/06/Picture-3-300x206.png" alt="Influence de la portée des variables en javascript" width="300" height="206" /></a><br />
<span id="more-653"></span><br />
Les fermetures lexicales et les <code>try/catch</code> augmentent d&#8217;autant la chaîne de résolution. Les <code>with</code> ajoutent un niveau à chaque accès à une variable et sont eux à éviter.</p>
<p>Globalement utilisez le mot clef <code>var</code> partout, ne laissez pas de variables globales. Quand vous utilisez plus d&#8217;une fois une donnée qui n&#8217;est pas globale à votre bloc de code, et particulièrement si elle est dans un tableau ou dans un objet, stockez là dans une variable locale pour un accès plus rapide.</p>
<h3>Boucles et listes</h3>
<p>Plus loin, dans les écrans 60+ Nicholas discute des boucles, avec quelques faits connus mais qu&#8217;il convient de rappeler, notamment que les conditions d&#8217;arrêt des boucles doivent être le plus simple possible : Si vous itérez dans un tableau, : stockez la taille du tableau dans une variable locale au lieu de tester sa valeur à chaque itération, et évitez for/in, for/each ou les équivalents each des différentes bibliothèques javascript.</p>
<p>C&#8217;est particulièrement vrai pour ce qui est retourné par les collections DOM, par exemple ce qui est dans <code>document.images</code> ou <code>document.getElementByTagName()</code>. Il s&#8217;agit de collections dynamiques et la recherche est relancée à chaque fois qu&#8217;on accède à une propriété de la liste, par exemple si on teste le nombre d&#8217;éléments de la liste en condition d&#8217;arrêt d&#8217;une boucle.</p>
<p>A propos des boucles, je vous conseille aussi <a href="http://blogs.sun.com/greimer/entry/best_way_to_code_a">ce billet de Greg Reimer</a> de chez Sun. Il y liste différentes manière de faire des boucles en javascript sur un tableau, un tableau épart, et une collection HTML, avec des microbenchmark pour comparer le tout.</p>
<h3>Repaint et reflow</h3>
<p>Pour rappel le reflow c&#8217;est le recalcul de la géométrie et de l&#8217;agencement de la page en fonction du formattage de tous les objets présents. Cela arrive quand on manipule le DOM, change les styles, ou récupère des informations de style.</p>
<p><a href="http://performance.survol.fr/avec/reflow/">Les solutions à apporter</a> ont toutes été déjà abordées ici mais les voici ensemble et confirmées par Nicholas :</p>
<ul>
<li>Faire les manipulations de DOM en dehors du document, par exemple dans un fragment ou en <code>display:none</code></li>
<li>Grouper ensemble les modifications de style, majoritairement en changeant la classe HTML au lieu du style directement, ou en utilisant <code>cssText</code></li>
<li>Mettre en cache les informations sur l&#8217;agencement de la page qu&#8217;on récupère via javascript, puis grouper séparément les lectures et les écritures</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2009/07/ameliorer-le-code-javascript/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
