<?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; deflate</title>
	<atom:link href="http://performance.survol.fr/avec/deflate/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>Attention aux compresseurs javascript</title>
		<link>http://performance.survol.fr/2008/06/attention-aux-compresseurs-javascript/</link>
		<comments>http://performance.survol.fr/2008/06/attention-aux-compresseurs-javascript/#comments</comments>
		<pubDate>Mon, 30 Jun 2008 10:32:55 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[deflate]]></category>
		<category><![CDATA[gzip]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[minimisation]]></category>
		<category><![CDATA[packer]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=46</guid>
		<description><![CDATA[En avril je vous parlais du packer de Dean Edwards qui permet de miniser le code javascript avant envoi. J&#8217;émettais un doute sur l&#8217;option base62. Avec cette option le code javascript est codé avant envoi. Une fois ce javascript reçu, &#8230; <a href="http://performance.survol.fr/2008/06/attention-aux-compresseurs-javascript/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://performance.survol.fr/2008/04/minimiser-le-javascript/">En avril</a> je vous parlais du <a href="http://dean.edwards.name/packer/">packer de Dean Edwards</a> qui permet de miniser le code javascript avant envoi. J&#8217;émettais un doute sur l&#8217;option base62. Avec cette option le code javascript est codé avant envoi. Une fois ce javascript reçu, le navigateur va le décoder, puis utiliser <code>eval()</code> pour l&#8217;exécuter. C&#8217;est tout sauf transparent pour le client, surtout que pendant ce temps de traitement supplémentaire, c&#8217;est tout le rendu et les téléchargements de la page qui sont bloqués.<span id="more-41"></span></p>
<h3>L&#8217;expérience</h3>
<p>Batiste Bieler a visiblement eu le même doute l&#8217;année dernière que moi et <a href="http://batiste.dosimple.ch/blog/2007-07-02-1/ ">publie des tests</a> réalisés sur Jquery. Après passage par mod_deflate le packer permet tout de même d&#8217;économiser presque 45% des 20ko de javascript. Ce n&#8217;est pas négligeable et on a naturellement tendance à foncer tête baissée. Le hic c&#8217;est que sur sa configuration ça multiplie par deux le temps total de gestion (téléchargement plus exécution) pour javascript. <a href="http://www.julienlecomte.net/blog/2007/08/13/">Julien Lecomte relève</a> lui près de 200ms de délai à cause du travail supplémentaire côté client. </p>
<p>Bref, tout ça n&#8217;est pas négligeable. Ce sera toujours un compromis entre le gain en bande passante et la perte en temps processeur, donc une machine très puissante avec une très mauvaise connectivité réseau aura potentiellement intérêt à utiliser le packer, mais Batiste a tout de même utilisé un code duo à 1.66Ghz par coeur et je doute que le portable ayant servi à Julien Lecomte soit obsolète au niveau des performances. Bref, sauf dans des conditions spécifiques, <strong>n&#8217;utilisez pas le packer/base62 pour des fichiers javascript compressés par mod_deflate ou mod_gzip</strong>.                         </p>
<p><a href="http://ejohn.org/blog/library-loading-speed/">John Resig en parlait</a> aussi en février avec un mot d&#8217;ordre explicite :</p>
<blockquote><p>La prochaine que vous choisisser une méthode de compression, rappelez-vous de cette formule : Performance_Total = Temps_de_Téléchargement + Temps_d_Exécution </p></blockquote>
<h3>L&#8217;influence de gzip</h3>
<p>En fait quand on regarde actuellement <a href="http://jquery.com/">le site de Jquery</a> c&#8217;est un peu plus clair. On vous propose une version décompressée pour les tests, une version minifiée et gzipée pour la production, et une version qui utilise le packer de Dean Edwards &laquo;&nbsp;pour ceux qui ne peuvent pas gziper leur javascript&nbsp;&raquo;. Au moins c&#8217;est clair.</p>
<p>Si on garde en tête les chiffres de Batiste on confirme cette idée : sans gzip 60ko de javascript sont transformés en 20ko compressés. Les différences sont alors plus importantes, l&#8217;impact sur le réseau est plus fort et le packer reprend de son intérêt. La question sera alors de savoir si vos visiteurs ont des machines puissantes ou pas. On choisira le packer de Dean dans le premier cas, et un procédé de minification plus classique dans le second cas. C&#8217;est d&#8217;ailleurs <a href="http://dean.edwards.name/weblog/2007/08/js-compression/">la recommandation de Dean Edwards</a> lui-même : il ne destine pas son outil à tous les usages.</p>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2008/06/attention-aux-compresseurs-javascript/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Compression avant transfert</title>
		<link>http://performance.survol.fr/2008/04/compression-avant-transfert/</link>
		<comments>http://performance.survol.fr/2008/04/compression-avant-transfert/#comments</comments>
		<pubDate>Tue, 15 Apr 2008 10:17:08 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[deflate]]></category>
		<category><![CDATA[gzip]]></category>
		<category><![CDATA[réseau]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=20</guid>
		<description><![CDATA[Après avoir parlé de minimisation, il est temps de parler de compression, la règle 4 des recommandations de l&#8217;équipe performance Yahoo!. Trop gros Une part importantes des téléchargements sont réalisés sur de simples fichiers textes : HTML, javascript, CSS, XML et &#8230; <a href="http://performance.survol.fr/2008/04/compression-avant-transfert/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Après avoir parlé de <a href="http://performance.survol.fr/2008/04/minimiser-le-javascript/">minimisation</a>, il est temps de parler de compression, <a href="http://developer.yahoo.net/blog/archives/2007/07/high_performanc_3.html">la règle 4</a> des <a href="http://developer.yahoo.com/performance/rules.html">recommandations de l&#8217;équipe performance Yahoo!</a>.</p>
<h3>Trop gros</h3>
<p>Une part importantes des téléchargements sont réalisés sur de simples fichiers textes : HTML, javascript, CSS, XML et JSON. Mis côte à côte ils peuvent représenter un poids non négligeable. C&#8217;est particulièrement vrai avec les bibliothèques javascript récentes. On dépasse alors les 50 ko pour la base, et plus si on ajoute les composants optionnels.</p>
<p>Un site classique avec Jquery c&#8217;est 25 ko pour le HTML, 10 ko pour les feuilles de style, 100 ko pour la bibliothèque javascript et encore bien 10 ko pour les fichiers javascript qui utilisent cette bibliothèque. La minification nous fait tomber respectivement à 15, 7, 50 et 6 ko, mais le total reste encore proche des 80 ko.<span id="more-18"></span></p>
<h3>Compresser avant envoi</h3>
<p>Tout est prévu, et il est possible de compresser nos fichiers avant de les envoyer, puis de les faire décompresser avant affichage par le navigateur. Cette fonctionnalité est gérée par une écrasante majorité des serveurs web et <a href="http://schroepl.net/projekte/mod_gzip/browser.htm">quasiment tous les navigateurs depuis Microsoft Internet Explorer 4</a>.</p>
<p>Lors de la transmission, c&#8217;est un fichier texte compressé qui est échangé. On peut compter que le poids est facilement divisé par deux sur un fichier qui a été minimisé au préalable mais ça peut aller jusqu&#8217;à un dixième du poids d&#8217;origine. 40 ko d&#8217;épargné, ce n&#8217;est pas la réussite de l&#8217;année mais <a href="http://www.ibm.com/developerworks/web/library/wa-httpcomp/">ça reste appréciable</a>.</p>
<h3>Auto-négociation</h3>
<p>Tout ça se base sur l&#8217;auto-négociation HTTP. Votre navigateur déclare qu&#8217;il sait gérer la compression avec une entête <code>Accept-encoding: gzip</code>. Le serveur la détecte, compresse son fichier HTML, et le renvoie avec une entête <code>Content-Encoding: gzip</code>. Tout est transparent pour l&#8217;utilisateur ou le navigateur. Si votre navigateur ne supporte pas la fonctionnalité, il n&#8217;enverra pas l&#8217;entête et recevra le contenu sans compression.</p>
<p>Pour les proxy les plus simples, ceux qui ne (dé)compressent pas les contenus en temps réel, le serveur ajoute une entête <code>Vary: Accept-encoding</code>. Le cache de ce contenu ne sera partagé que entre les navigateurs qui envoient la même entête <code>Accept-encoding</code> (c&#8217;est à dire quasiment tous).</p>
<p>L&#8217;auto-négociation fait très bien son travail. Il ne vous reste plus qu&#8217;à exclure les rares vieux navigateurs qui déclarent supporter la compression mais ont quelques bugs gênants. Si vous détectez ces navigateurs avec un support cassé vous pouvez ajouter <code>Vary: Accept-encoding, User-Agent</code>. </p>
<h3>Quels fichiers</h3>
<p>On compresse ainsi tout ce qui est fichier texte. On évite les images non vectorielles, qui sont en général déjà compressées avec des algorithmes spécifiques, ainsi que les fichiers binaires,  certains comme les fichiers OpenOffice sont déjà le résultat d&#8217;une compression et les autres ont trop souvent un taux de compression assez faible.</p>
<p>Un tri très rapide peut être fait à partir des types mime des fichiers : on compresse tout ce qui est en <code>text/*</code> et on laisse le reste tel quel, en particulier les images. Si vous voulez faire de la gestion fine vous pouvez aussi compresser les fichiers Microsoft Office .doc, .ppt et .xls (qui se compressent très bien).</p>
<h3>Quel format et quel module</h3>
<p>Il y a deux formats de compressions pour HTTP, tous deux supportés correctement : <a href="http://en.wikipedia.org/wiki/Gzip">gzip</a> (RFC 1951 et 1952), <a href="http://en.wikipedia.org/wiki/Deflate">deflate</a> (RFC 1951 et 1950) et <a href="http://en.wikipedia.org/wiki/Compress">compress</a>. Ce dernier est pour ainsi dire inutilisé dans les échanges Web. Les deux autres sont à peu près équivalents. Pour être précis <a href="http://www.gzip.org/deflate.html">gzip est simplement du deflate</a> avec quelques meta-données.</p>
<p>Pour le serveur web Apache, cela se traduit dans deux modules : <a href="http://sourceforge.net/projects/mod-gzip/">mod_gzip</a> et <a href="http://httpd.apache.org/docs/2.0/mod/mod_deflate.html">mod_deflate</a>. Le premier est habituel sous Apache 1.3, le second par défaut est fourni avec Apache 2.0. Les performances sont similaires, même si l&#8217;algorithme utilisée par mod_gzip donne des fichiers légèrement plus petits (mod_deflate utilise la bibliothèque système zlib alors que mod_gzip utilise son propre code). La différence entre les deux se joue plutôt sur les fonctionnalités des implémentations des deux modules. Mod_gzip propose en effet quelques possibilités en plus.</p>
<p>Pour IIS j&#8217;ai vu passer des liens vers <a href="http://www.port80software.com/products/zipenable/">zipenable</a> et <a href="http://www.port80software.com/products/httpzip/">httpZip</a> mais <a href="http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/25d2170b-09c0-45fd-8da4-898cf9a7d568.mspx?mfr=true">il semble qu&#8217;un support soit inclus par défaut</a>. PHP a aussi la directive de configuration <code>zlib.output_compression</code> pour compresser son résultat avant l&#8217;envoi au navigateur, mais il est probablement plus cohérent de passer par le serveur web pour gérer de genre de questions.</p>
<h3>Les performances</h3>
<p>Pour le client c&#8217;est entre 50 et 90% du traffic réseau sur les fichiers textes et Microsoft Office qui est épargné. Tout cela n&#8217;est bien entendu pas neutre pour le serveur. On parle souvent de 5% d&#8217;occupation processeur pour compresser les contenus. Donner un chiffre est hasardeux car cela dépend trop du serveur, du matériel, des fichiers à compresser et de la charge cpu.</p>
<p>Il est pourtant possible de dire que la charge supplémentaire ne sera pas très importante en regard du gain réseau. C&#8217;est d&#8217;autant que le traffic réseau est cher, la puissance processeur ne l&#8217;est plus tant que ça. Si vous vous contentez des fichiers textes et fichiers Microsoft Office, que vous ne lancez pas de compression pour des fichiers trop petits (1ko) ou (pour mod_gzip) des fichiers trop gros, vous avez peu de chance de faire des contre-performances.</p>
<h3>La configuration et les options</h3>
<p>Pour vous aider sur mod_gzip et mod_deflate vous avez la possibilité de préciser un niveau de compression avec neuf valeurs prédéfinies de 1 une compression minimum à 9 pour une compression maximum. Il est souvent conseillé de se fixer entre 4 et 6. Monter à 9 occupe beaucoup le processeur pour une différence de taille minime. Aux valeurs les plus faibles votre serveur n&#8217;est quasiment pas occupé mais le gain de taille est déjà visible.</p>
<p>Pour ceux qui ont le plus gros traffic d&#8217;autres stratégies sont possibles. Les fichiers compressés peuvent être stockés sur le disque pour éviter d&#8217;être recalculés à chaque accès par exemple. Il est même possible de pré-compresser les fichiers et opérer à l&#8217;inverse : faire faire décompresser les fichiers au serveur pour les quelques rares navigateurs qui ne savent pas gérer la compression.</p>
<h3>Et vous ?</h3>
<p>Un doute sur votre serveur ? deux pages en ligne vous permet de tester votre site : <a href="http://www.whatsmyip.org/mod_gzip_test/">le mod_gzip_test</a> et <a href="http://www.gidnetwork.com/tools/gzip-test.php">le gzip_test</a>. Faites bien attentions aux résultats de Firebug qui peuvent être modifiés par votre proxy, votre anti-virus, vos anti-spyware, vos pare-feux, vos extensions et les outils de protection de la vie privée que vous pourriez avoir : tout ça peut intervenir avant Firebug et décompresser le flux pour le filtrer avant de le renvoyer.</p>
<p>Vous avez aussi <a href="http://www.port80software.com/tools/compresscheck.asp">compression test</a> et <a href="http://www.port80software.com/products/httpzip/bandwidthcalc">bandwith calc</a> de port80. Le premier télécharge une page et calcule le gain que vous auriez si le contenu était compressé. Avec cette mesure, le second outil vous permet de calculer les économies sur la facture réseau. C&#8217;est là que vous verrez vite si échanger du réseau contre du processeur est intéressant ou pas.</p>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2008/04/compression-avant-transfert/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
