<?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; prefetch</title>
	<atom:link href="http://performance.survol.fr/avec/prefetch/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>DNS Prefetch</title>
		<link>http://performance.survol.fr/2009/06/dns-prefetch/</link>
		<comments>http://performance.survol.fr/2009/06/dns-prefetch/#comments</comments>
		<pubDate>Wed, 17 Jun 2009 10:00:46 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[domaine]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[latence]]></category>
		<category><![CDATA[préchargement]]></category>
		<category><![CDATA[prefetch]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=573</guid>
		<description><![CDATA[J&#8217;adore le principe du préchargement. Il s&#8217;agit tout simplement de charger par avance les informations dont on pense avoir besoin plus tard pour pouvoir les utiliser instantanément à ce moment là. Quand plus rien ne fonctionne, le préchargement peut encore améliorer &#8230; <a href="http://performance.survol.fr/2009/06/dns-prefetch/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>J&#8217;adore le principe du préchargement. Il s&#8217;agit tout simplement de charger par avance les informations dont on pense avoir besoin plus tard pour pouvoir les utiliser instantanément à ce moment là. Quand plus rien ne fonctionne, le préchargement peut encore améliorer les choses.</p>
<p>Firefox faisait déjà du préchargement, intelligemment, et ça sera probablement spécifié dans HTML 5. J&#8217;en reparlerai plus tard.</p>
<p>Aujourd&#8217;hui c&#8217;est de <a href="http://www.commentcamarche.net/contents/internet/dns.php3">DNS</a> que je souhaite parler. <a href="http://dev.chromium.org/developers/design-documents/dns-prefetching">Chrome</a> et <a href="https://developer.mozilla.org/En/Controlling_DNS_prefetching">Firefox 3.5</a> ont en effet tous deux la bonne idée de précharger les requêtes DNS. Pour les versions plus anciennes de Firefox il existe même <a href="https://addons.mozilla.org/en-US/firefox/addon/8923">une extension</a>. Etonnamment (et malheureusement) ce n&#8217;est pas encore dans les brouillons HTML 5 par contre.<span id="more-573"></span></p>
<h3>Comment ?</h3>
<p>Trois types de préchargement sont identifiés :</p>
<p>Tout d&#8217;abord le navigateur identifie les liens vers toutes les ressources à charger et tente de résoudre le nom de domaine au plus tôt, en parallèle des autres téléchargements afin que cette résolution soit disponible quand il y en a besoin. Je suppose que l&#8217;effet sera ici très restreint car très fréquemment dès qu&#8217;un ressource vers un nouveau domaine est identifiée alors le téléchargement est immédiatement lancé. Les seules effets que je vois c&#8217;est si vous épuisez la totalité des fils de téléchargements du navigateur, ou si une ressource bloque les files de téléchargement (par exemple un <a href="http://performance.survol.fr/2008/08/javascript-non-bloquant/">javascript bloquant</a>). Le premier cas ne doit quasiment jamais arriver, sur Firefox il faudrait 30 téléchargements simultanés répartis équitablement sur 5 domaines différents, sur Chrome c&#8217;est plus de 60 répartis équitablement sur plus de 10 domaines. Le second cas arrive de moins en moins (<a href="http://www.stevesouders.com/ua/">chrome 2 et Firefox 3.5 ne bloquent plus les téléchargements sur les javascript</a>).</p>
<p>Le second type de préchargement c&#8217;est analyser tous les liens sur lesquels l&#8217;utilisateur peut cliquer, pour résoudre par avance le nom de domaine. Il y aura un gain réel dès que vous utilisez un lien entre deux sites distincts, c&#8217;est à dire très fréquemment quand même.. L&#8217;effet est réduit (on ne gagne que le temps de la résolution DNS) mais il vous fera effectivement gagner du temps.</p>
<p>Le troisième type de préchargement est déclaratif. Le navigateur repère les liens de type<code> &lt;link rel="dns-prefetch" href="//example.org"&gt;</code> et précharge la résolution DNS. Charge à l&#8217;auteur de faire les déclarations pertinentes en sachant ce qu&#8217;il précharge et pourquoi.</p>
<p>Chrome a en fait un quatrième type de préchargement DNS. Il retient à chaque fois les dix domaines résolus au précédent démarage, et les précharge pour vous immédiatement. Vos deux ou trois premiers clics à l&#8217;ouverture du navigateur seront donc magiquement accélérés. C&#8217;est peut être aussi ça qui donne l&#8217;impression de performance ressentis par certains. Mieux, il précharge les sites proposés dans l&#8217;autocomplétion de la barre d&#8217;adresse et de recherche. Le temps que vous preniez votre décision, l&#8217;option a déjà été préchargée et la page s&#8217;affichera d&#8217;autant plus rapidement. Là si l&#8217;effet lui même n&#8217;est pas plus important que les précédents, le ressenti utilisateur est clairement grandement amélioré, on donne une impression de continuité et de réactivité dans tout le navigateur, ce qui est exactement le ressenti exprimé par les utilisateurs de Chrome.</p>
<h3>Pour quoi ?</h3>
<p>Une résolution DNS c&#8217;est couramment entre 30 et 200 ms. Sur des sites américains, c&#8217;est assez souvent plus de 100 ms. Ces mécanismes de préchargement peuvent faire gagner la résolution DNS initiale, et donc la latence de la première requête, la plus importante. Pouvoir avancer dans le temps une ou deux résolutions DNS dans la page peut aussi améliorer les choses, mais je crains que là l&#8217;effet soit plus restreint. Dans l&#8217;ensemble c&#8217;est jusqu&#8217;à 150 ms qu&#8217;on peut gagner. Ce n&#8217;est pas grand chose mais <a href="http://performance.survol.fr/2008/06/a-quoi-ca-sert/">ça reste quand même significatif</a>.</p>
<p>Pour d&#8217;autres pays le résultat peut être encore plus important. Ainsi Google a <a href="http://blog.chromium.org/2008/09/dns-prefetching-or-pre-resolving.html">ses propres statistiques</a> récoltées avec Chrome où on voit que <a href="http://2.bp.blogspot.com/_LJuAPqyUVas/SNE-y5DnY9I/AAAAAAAAAA0/L0oFIrUIkxw/s1600-h/histogram.PNG">la moitié de des requêtes DNS des utilisateurs test se font en plus de 100 ms</a>. Là où ça devient vraiment inacceptable c&#8217;est de voir que la moyenne est de 217 ms et qu&#8217;il y a encore pas loin de 10 % des requêtes qui dépassent la demi seconde. Même si ça arrive rarement, pouvoir gagner cette demi seconde est une victoire incontestable pour le confort utilisateur.</p>
<h3>Vie privée et désactivation</h3>
<p>Les petits malins auront remarqué qu&#8217;avec ce principe, en installant un mouchard dans son serveur DNS et en générant un nom de domaine unique différent à chaque utilisateur on peut traquer l&#8217;utilisateur. L&#8217;intérêt par rapport à une bête balise image est cependant assez faible. On peut déjà faire la même chose, mais en plus simple.</p>
<p>Si toutefois la chose vous gêne, vous pouvez le désactiver dans vos préférences Firefox (cherchez <code>network.dns.disablePrefetch</code>), ou ajouter une balise meta sur vos pages : <code>&lt;meta http-equiv="x-dns-prefetch-control" content="off"&gt;</code>. Mais pourquoi voudriez-vous diminuer l&#8217;expérience utilisateur de toutes façons ?</p>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2009/06/dns-prefetch/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Préchargement des images CSS avec Jquery</title>
		<link>http://performance.survol.fr/2009/04/prechargement-des-images-css-avec-jquery/</link>
		<comments>http://performance.survol.fr/2009/04/prechargement-des-images-css-avec-jquery/#comments</comments>
		<pubDate>Fri, 17 Apr 2009 11:00:44 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[image]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[préchargement]]></category>
		<category><![CDATA[prefetch]]></category>
		<category><![CDATA[réseau]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=477</guid>
		<description><![CDATA[Dans le préchargement l&#8217;idée est de faire travailler le navigateur avant que l&#8217;utilisateur ne demande les documents pour que ce soit quasiment instantané ensuite. On attend la fin de chargement de la page, et on lance par avance le téléchargement &#8230; <a href="http://performance.survol.fr/2009/04/prechargement-des-images-css-avec-jquery/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Dans le préchargement l&#8217;idée est de faire travailler le navigateur avant que l&#8217;utilisateur ne demande les documents pour que ce soit quasiment instantané ensuite. On attend la fin de chargement de la page, et on lance par avance le téléchargement de plusieurs liens dont on pense qu&#8217;ils serviront plus tard. C&#8217;est très intéressant pour quelques logos, css ou javascript. Imaginez une page d&#8217;accueil avec un style bien différent du reste du site : il peut être avantageux de précharger la feuille de style ou le javascript qui seront utilisés sur les autres pages.</p>
<p>C&#8217;est Marc Hertzog qui se colle à <a href="http://marcarea.com/weblog/?post/2008/07/12/Plug-in-jQuery-pour-pre-charger-les-images-CSS">l&#8217;exercice</a> avec JQuery. Il a amélioré <a href="http://www.filamentgroup.com/lab/update_automatically_preload_images_from_css_with_jquery/">un module de Scott Jehl</a> qui lit une feuille de style et tente de précharger toutes les images qui y sont référencées. L&#8217;idée est séduisante. On supprime alors les temps d&#8217;attente pour les images qui s&#8217;affichent au survol de la souris ou sur les pages suivantes.</p>
<p>L&#8217;idée est séduisante mais je n&#8217;accroche pas tout à fait.<span id="more-477"></span> Tout d&#8217;abord parce que c&#8217;est au navigateur de faire ça. J&#8217;ai souvent dit que sur les performances on compensait les manques des navigateurs et qu&#8217;il fallait être pragmatiques (le faire quand même même si dans l&#8217;idéal c&#8217;est le boulot du navigateur) mais là il s&#8217;agit de quelque chose de simple, très simple. Quand un &laquo;&nbsp;quick win&nbsp;&raquo; n&#8217;est pas réalisé par des gens intelligents &#8211; et les développeurs de navigateur le sont &#8211; c&#8217;est qu&#8217;il y a anguille sous roche.</p>
<p>Le plus gros défaut que je vois est celui inhérent à tout préchargement : on fait travailler le navigateur. Sur un poste personnel avec une navigation très linéaire ça n&#8217;a d&#8217;effet négatif quasi que sur les prestataires réseau. Mais sur une ligne partagée (entreprise, wifi), avec des gens très connectés (vidéo en streaming parallèle, deezer ou spotify en tâche de fond), ou simplement sur une navigation avec beaucoup d&#8217;onglets (vous faites une recherche, vous ouvrez beaucoup de pages en parallèle), vous pénalisez l&#8217;utilisateur ou ses voisins. Même chose pour un utilisateur en itinérance : utiliser son réseau et son processeur pour ça aura une influence forte sur sa batterie.</p>
<p>Le préchargement reste une bonne idée, mais à petite dose, pour des choses ciblées, prévues. Ici on télécharge tout sans discernement. C&#8217;est certain, on va aussi télécharger des éléments qui ont une faible probabilité d&#8217;être utile. Dans les commentaires de la version originale du script on propose de faire un tri sur l&#8217;url de chaque image, suivant son répertoire on décide si c&#8217;est une image qui doit être préchargée ou pas. On résout ainsi l&#8217;occupation réseau (mais pas l&#8217;occupation processeur), mais ça commence à faire usine à gaz. Sans compter que une même image peut avoir du sens pour un préchargement sur certaines pages mais pas sur d&#8217;autres.</p>
<p>À ce compte là autant lister les images à précharger dans un tableau javascript au lieu de lire toute la feuille de style. Ou mieux, des <a href="https://developer.mozilla.org/En/Link_prefetching_FAQ">&lt;link rel=&nbsp;&raquo;prefetch&nbsp;&raquo;&gt;</a> parce que c&#8217;est fait pour ça.</p>
<p>Enfin, c&#8217;est surtout utile pour les changement d&#8217;image au survol de la souris, ou sur une action utilisateur. Dans ce cas on modifie l&#8217;image en cours, ou on affiche des icônes. Bref, on se retrouve très généralement dans des cas où les images concernées sont de toutes façons dans des sprites, soit avec une liste d&#8217;icône, soit avec l&#8217;image qu&#8217;on remplace &#8211; l&#8217;image contient alors et la version sans survol et la version avec survol.</p>
<p>Bref, l&#8217;idée est bonne mais je reste septique sur la pertinence de mettre en place une solution générique de ce type.</p>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2009/04/prechargement-des-images-css-avec-jquery/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
