<?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; xml</title>
	<atom:link href="http://performance.survol.fr/avec/xml/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>JSON ?</title>
		<link>http://performance.survol.fr/2008/04/json/</link>
		<comments>http://performance.survol.fr/2008/04/json/#comments</comments>
		<pubDate>Fri, 25 Apr 2008 17:16:35 +0000</pubDate>
		<dc:creator>Éric</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[eval]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xmlhttprequest]]></category>

		<guid isPermaLink="false">http://performance.survol.fr/?p=23</guid>
		<description><![CDATA[JSON ! c&#8217;est le cri de tous les développeurs web à la mode dès qu&#8217;ils entendent parler d&#8217;échanges de données. Ce format est sensé être plus performant, plus simple, plus standard, plus performant, plus web 2.0 quoi. Plusieurs points mériteraient &#8230; <a href="http://performance.survol.fr/2008/04/json/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://json.org/"><acronym title="Javascript object notation">JSON</acronym></a> ! c&#8217;est le cri de tous les développeurs web à la mode dès qu&#8217;ils entendent parler d&#8217;échanges de données. Ce format est sensé être plus performant, plus simple, plus standard, plus performant, plus web 2.0 quoi.</p>
<p>Plusieurs points mériteraient un billet à part entière, et je suis en désaccord sur chacun d&#8217;eux, mais je me focaliserai ici sur un seul : la performance. Les performances peuvent se voir au niveau du téléchargement et au niveau de l&#8217;interprétation par le client.<span id="more-21"></span></p>
<h3>Formats d&#8217;échange</h3>
<p>Nous avons trois formats d&#8217;échanges courants : JSON, <acronym title="extensible markup language">XML</acronym>, et <acronym title="hypertext markup language">HTML</acronym>. </p>
<p>JSON est apparu car il est simple à interpréter avec <code>eval()</code>. Maintenant dès qu&#8217;il y a un risque que quelqu&#8217;un d&#8217;autre puisse manipuler les données, il y a un problème de sécurité. On utilise donc couramment des bibliothèques Javascript externes. Ces bibliothèques analysent la chaîne json à coup d&#8217;expression rationnelles. Il existe aussi un bibliothèque d&#8217;analyse <a href="http://developer.mozilla.org/en/docs/nsIJSON">JSON native dans Firefox</a> mais elle n&#8217;est accessible sans privilèges ni dans la version 2 <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=408838">ni dans la version 3</a>. Je ferai la différence entre les trois en parlant de JSON+regexp, JSON+eval et JSON+firefox. </p>
<p>XML est plus classique. A priori en Javascript vous utilisez <acronym title="document object model">DOM</acronym> pour l&#8217;analyser. Sur les navigateurs récents ça sera peut être du <a href="http://en.wikipedia.org/wiki/E4X"><acronym title="Ecmascript for XML">E4X</acronym></a>. Si votre but est de sortir du HTML, vous pouvez aussi utiliser le moteur <acronym title="XSL transformation">XSLT</acronym> des navigateurs. Là aussi, si besoin on séparera XML+dom, XML+e4x et XML+xslt.</p>
<p>Enfin, renvoyer une grosse chaîne HTML reste toujours faisable. S&#8217;il faut encore extraire des valeurs rien n&#8217;empêche d&#8217;avoir du XHTML. Vous bénéficier de DOM si besoin et vous pouvez envoyer ça directement dans vos pages HTML sans y toucher.</p>
<h3>Taille à télécharger</h3>
<p>La même données est plus petite en JSON qu&#8217;en XML. Pour chaque élément le nom de la donnée est présent une fois en JSON, et deux fois (ouverture + fermeture) en XML. Par contre la différence n&#8217;est pas aussi importante qu&#8217;on le croit. Alexis Moussine-Pouchkine trouve qu&#8217;<a href="http://blogs.sun.com/alexismp/entry/java_json_and_or_xml">en moyenne JSON est 40% plus petit que XML</a>. Des test rapides de mon côté me donnent des chiffres légèrement moins optimistes, vers les 35%. Je garderai 40% par précaution.</p>
<p>40% c&#8217;est en même temps énorme et pas grand chose. C&#8217;est énorme en soi mais les données transférées sont généralement petites. Si on part sur une donnée de 2ko, la différence sera de 800 octets. C&#8217;est notable mais pas important non plus. C&#8217;est même probablement négligeable face au reste. </p>
<p>Reste encore que XML et JSON sont tous les deux des formats qui se compressent très très bien. Si on espère un ratio de compression de 20%, nos 2ko deviennent moins de 500 octets. À ce niveau même si le ratio JSON/XML restait le même, le gain serait proche de 160 octets. Si on compte la requête et les entêtes de réponse (entre 1ko et 1.5ko), on a un gain total de 160 octets sur environ 2ko. Autant dire que ce n&#8217;est pas significatif. </p>
<p>Pour que ce soit significatif (1ko de différence), il faudrait que notre XML fasse environ 12ko. Ca reste assez rare. JSON et XML à égalité ou presque sur ce point là.  </p>
<h3>Oui mais&#8230;</h3>
<p>Oui mais on a parlé de JSON+lib, qui est la technique sans problèmes de sécurité. Et là il faut une bibliothèque externe à télécharger. La plus courante est <a href="http://www.json.org/json.js">celle de Douglas Crockford</a> qui fait 12ko décompressé. <a href="http://www.yahooapis.com/yui/json/">Celle de YUI</a> a sensiblement la même taille. Là même zippé il restera un nombre à 4 chiffres. Ca devient vraiment gênant si vous n&#8217;arrivez pas à fusionner ce fichier avec vos autres fichiers javascript : là vous aurez une requête <acronym title="hypertext transfer protocol">HTTP</acronym> de plus, avec la latence et les problème de rendu bloqués que ça implique.</p>
<p>Finalement la différence est vraiment légère mais à l&#8217;avantage de XML. JSON vous demandera au mieux 1ko de plus une fois minifié et gzipé.</p>
<h3>Temps à analyser</h3>
<p>C&#8217;est là qu&#8217;on s&#8217;amuse. XML est lent à interpréter, c&#8217;est connu par tous et je ne le contesterai certainement pas. Maintenant JSON l&#8217;est aussi, et ça c&#8217;est moins accepté. L&#8217;utilisation de <code>eval()</code> demande à javascript lancer un nouvel interpréteur et empêche le moteur d&#8217;optimiser tout ce qu&#8217;il y a autour du <code>eval()</code>. <a href="http://dev.opera.com/articles/view/efficient-javascript/?page=2#rewriteeval">C&#8217;est lent</a>, <a href="http://blogs.msdn.com/ericlippert/archive/2003/11/01/53329.aspx">spécialement sur Microsoft Internet Explorer</a>. JSON+lib est malheureusement encore pire vu que l&#8217;interprétation se fait cette fois ci en pur javacript.</p>
<p>D&#8217;autres que moi ont fait des tests. Un premier test trouve <a href="http://dev.robertmao.com/2007/10/01/json-vs-xml-parsing-performance/">XML+dom deux fois plus rapide que JSON+eval</a>. Dave Johnson <a href="http://blogs.nitobi.com/dave/?p=68">des graphiques intéressants</a> en fonction du nombre d&#8217;éléments dans le jeu de données. Du plus rapide au plus lent sous Microsoft Internet Explorer 6 il trouve XML+xslt, XML+dom et enfin JSON+eval. Sous Firefox 1.5 c&#8217;est JSON+eval qui est plus rapide mais la différence est moitié moins importante. En considérant <a href="http://standblog.org/blog/post/2008/04/25/Firefox-progress-in-Europe">un marché français de 25% de Firefox</a>, JSON+eval est en moyenne nettement plus lent.</p>
<p>J&#8217;aimerais trouver des comparatifs de performance avec <a href="http://developer.mozilla.org/presentations/xtech2005/e4x/">XML+e4x</a>. La différence risque de s&#8217;agrandir d&#8217;autant plus. Il faut aussi ajouter qu&#8217;un appel à XMLHttpRequest.responseText serait environ deux fois plus lent qu&#8217;un appel à XMLHttpRequest.responseXML. Je ne comprend pas pourquoi et je n&#8217;ai pas vérifié la validité de l&#8217;affirmation mais cela se rajouterait encore à la différence, en faveur de XML.</p>
<p>Reste à vérifier si cette différence de performance est significative. Le premier test est fait sur 10000 entrées pour un gain de 15ms (sur le second test on ne connait pas le temps pris par chaque itération). Peut être qu&#8217;un <a href="http://starkravingfinkle.org/blog/2008/02/extension-developers-native-json-parsing/">support natif</a> dans dans les navigateurs fera la différence dans quelques années. Pour l&#8217;instant, même si JSON est plus lent, les différences ne sont pas significatives.  </p>
<h3>Oui mais&#8230;</h3>
<p>Oui mais là aussi je n&#8217;ai pas pris en compte JSON+lib. Il faut non seulement interpréter les 12ko de javascript au départ mais ensuite faire tourner le moteur basé sur des expressions rationnelles. Il y a mieux. C&#8217;est toujours Dave Johnson qui nous propose <a href="http://blogs.nitobi.com/dave/?p=45">un comparatif entre JSON+lib, JSON+eval</a> et XML+xslt. Il y a un monde entre JSON+lib et JSON+eval, quel que soit le navigateur. Même avec peu d&#8217;itérations, on voit les temps monter significativement dans le test JSON+lib.</p>
<p>Pire, sous Microsoft Internet Explorer et avec JSON, le temps nécessaire pour l&#8217;analyse évolue en factorielle avec le nombre d&#8217;éléments dans les données. Ca c&#8217;est disqualifiant. Plus la données est grosse, plus la différence de performance entre JSON et XML augmente. Une augmentation non linéaire est rarement négligeable.</p>
<p>Plus haut je disais que sur plus de 10ko la différence de téléchargement devenait significative en faveur de JSON. Mais avec ces résultats on voit aussi que la différence de temps de traitement le devient aussi, dans le sens opposé. La différence de taille évoluant linéairement et la différence de temps de traitement évoluant de manière factorielle, JSON ne sera jamais plus performant. N&#8217;oublions pas que pendant que Javascript est exécuté, c&#8217;est toute l&#8217;interface qui ne répond plus.</p>
<h3>Alors ?</h3>
<p>Alors quoi ? Alors déjà il faudrait un peu plus de test. J&#8217;en ferai peut être si je ne trouve rien de suffisamment complet. Il faudrait par exemple vérifier si le mauvais à priori du à évolution en factorielle et mauvaise performance des bibliothèques javascript pour JSON se traduit par des valeurs significatives ou pas. Si ça se joue au final à quelques dizaines de millisecondes par exécution c&#8217;est négligeable, si ça dépasse la demi-seconde ça ne l&#8217;est peut être pas.</p>
<p>Ceci dit, en attendant, je peux affirmer une chose claire : JSON n&#8217;a aucun avantage côté performance. XML se payerait même le luxe d&#8217;être au moins légèrement plus performant, à cause de sa gestion native dans les navigateurs.</p>
<p>Cette petite étude ne me permet pas de refuser JSON, par contre elle me permet de commencer à douter de ses soit-disant avantages. XML est présent partout, dans tous les langages, dans la plupart des applications. Il gagnera toujours les points compatibilité, extensibilité et pérennité. Est-ce que ça vaut vraiment la peine de s&#8217;embêter avec JSON sur le web tant qu&#8217;il n&#8217;y a pas d&#8217;avantages de performance ?           </p>
]]></content:encoded>
			<wfw:commentRss>http://performance.survol.fr/2008/04/json/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
	</channel>
</rss>
