Je crée une bibliothèque JavaScript sophistiquée pour travailler avec le framework côté serveur de mon entreprise.
Le framework côté serveur code ses données dans un format XML simple. Il n'y a pas d'espaces de noms fantaisistes ou quelque chose comme ça.
Idéalement, je voudrais analyser toutes les données du navigateur en tant que JSON. Cependant, si je fais cela, je dois réécrire une partie du code côté serveur pour cracher également JSON. C'est pénible car nous avons des API publiques que je ne peux pas facilement changer.
Ce qui m'inquiète vraiment ici, c'est la performance dans le navigateur de l'analyse JSON par rapport à XML. Y a-t-il vraiment une grande différence à craindre? Ou devrais-je opter exclusivement pour JSON? Quelqu'un a-t-il une expérience ou des références dans la différence de performance entre les deux?
Je me rends compte que la plupart des développeurs Web modernes opteraient probablement pour JSON et je peux voir pourquoi. Cependant, je suis vraiment intéressé par la performance. S'il y a une énorme différence prouvée, je suis prêt à dépenser l'effort supplémentaire pour générer le côté serveur JSON pour le client.
JSON devrait être plus rapide car c'est [~ # ~] js [~ # ~] Notation d'objet, ce qui signifie qu'il peut être reconnu nativement par JavaScript. Dans PHP du côté GET, je ferai souvent quelque chose comme ceci:
<script type="text/javascript">
var data = <?php json_encode($data)?>;
</script>
Pour plus d'informations à ce sujet, voir ici:
Pourquoi tout le monde choisit-il JSON sur XML pour jQuery?
Aussi ... quel "effort supplémentaire" devez-vous vraiment consacrer à la "génération" de JSON? Vous ne pouvez certainement pas dire que vous allez créer manuellement la chaîne JSON? Presque tous les langages côté serveur modernes ont des bibliothèques qui convertissent les variables natives en chaînes JSON. Par exemple, le noyau de PHP json_encode
la fonction convertit un tableau associatif comme ceci:
$data = array('test'=>'val', 'foo'=>'bar');
dans
{"test": "val", "foo": "bar"}
Ce qui est simplement un objet JavaScript (car il n'y a pas de tableaux associatifs (à proprement parler) dans JS).
Tout d'abord, je voudrais remercier tous ceux qui ont répondu à ma question. J'apprécie vraiment toutes vos réponses.
En ce qui concerne cette question, j'ai mené des recherches supplémentaires en exécutant des repères. L'analyse se produit dans le navigateur. IE 8 est le seul navigateur qui ne dispose pas d'un analyseur JSON natif. Le XML est les mêmes données que la version JSON.
Chrome (version 8.0.552.224), JSON: 92 ms, XML: 90 ms
Firefox (version 3.6.13), JSON: 65 ms, XML: 129 ms
IE (version 8.0.6001.18702), JSON: 172 ms, XML: 125 ms
Fait intéressant, Chrome semble avoir presque la même vitesse. Veuillez noter que cela analyse beaucoup de données. Avec de petits extraits de données, ce n'est probablement pas si grave.
Des repères ont été établis. En voici un . La différence dans certains des navigateurs précédents semblait être un ordre de grandeur entier (de l'ordre de 10s de millisecondes au lieu de 100s de ms), mais pas énorme. Cela tient en partie au temps de réponse du serveur - XML est plus volumineux en tant que format de données. Une partie du temps est analysé - JSON vous permet d'envoyer des objets JavaScript, tandis que XML nécessite l'analyse d'un document.
Vous pouvez envisager d'ajouter à votre API publique une méthode pour retourner JSON au lieu de modifier les fonctions existantes si elles deviennent et émettent, sauf si vous ne souhaitez pas exposer le JSON.
Voir aussi la question SO Quand préférer JSON à XML?
Les performances ne sont pas vraiment une considération, en supposant que vous ne parlez pas de gigaoctets de XML. Oui, cela prendra plus de temps (XML est plus verbeux), mais ce ne sera pas quelque chose que l'utilisateur remarquera.
Le vrai problème, à mon avis, est la prise en charge de XML dans JavaScript. E4X est Nice, mais il n'est pas pris en charge par Microsoft. Vous devrez donc utiliser une bibliothèque tierce (telle que JQuery) pour analyser le XML.
Si possible, il serait logique de le mesurer. Par "si possible", je veux dire que les outils pour javascript (en particulier pour l'analyse des performances) peuvent ne pas être aussi bons que pour les langages de programmation autonomes.
Pourquoi mesurer? Parce que la spéculation basée uniquement sur les propriétés des formats de données n'est pas très utile pour l'analyse des performances - les intuitions des développeurs sont notoirement médiocres pour prédire les performances. Dans ce cas, cela signifie simplement que tout se résume à la maturité des analyseurs (et générateurs) XML et JSON respectifs utilisés. XML a l'avantage d'avoir existé plus longtemps; JSON est un peu plus simple à traiter. Ceci basé sur le fait d'avoir écrit des bibliothèques pour traiter les deux. Au final, si toutes choses sont égales (maturité et optimisation des performances des bibliothèques), JSON peut en effet être un peu plus rapide à traiter. Mais les deux peuvent être très rapides; ou très lent avec de mauvaises implémentations.
Cependant: je soupçonne que vous ne devriez pas trop vous soucier des performances, comme beaucoup l'ont déjà suggéré. Les deux xml et json peuvent être analysés efficacement, et avec les navigateurs modernes, probablement. Il y a des chances que si vous avez des problèmes de performances, ce n'est pas avec la lecture ou l'écriture de données, mais autre chose; et la première étape serait de déterminer le problème réel.
étant donné que JSON est natif et conçu pour Javascript, il va surpasser l'analyse XML toute la journée. vous n'avez pas mentionné votre langage côté serveur, dans PHP il y a la fonctionnalité json_encode/json_decode intégrée au noyau PHP ...
la différence de performance sera si minime que vous ne le remarquerez même pas (et: vous ne devriez pas penser aux problèmes de performances avant d'avoir avoir des problèmes de performances - il y a beaucoup de points plus importants à prendre en compte pour - code maintenable, lisible et documenté ...).
mais, pour répondre à votre question: JSON sera plus rapide à analyser (car c'est une simple notation d'objet javascript).
Dans cette situation, je dirais que je m'en tiens au XML. Tous les principaux navigateurs ont une interface d'analyse DOM qui analysera le XML bien formé. Ce lien montre un moyen d'utiliser l'interface DOMParser
dans Webkit/Opera/Firefox, ainsi que l'objet DOM ActiveX dans IE: https://sites.google.com/a/van- steenbeek.net/archive/Explorer_domparser_parsefromstring
Cela dépend également de la structure de votre JSON. Les structures arborescentes ont tendance à analyser plus efficacement qu'une liste d'objets. C'est là que la compréhension fondamentale des structures de données sera utile. Je ne serais pas surpris si vous analysez une structure de type liste dans JSON qui pourrait ressembler à ceci:
{
{
"name": "New York",
"country":"USA",
"lon": -73.948753,
"lat": 40.712784
},
{
"name": "Chicago",
"country":"USA",
"lon": -23.948753,
"lat": 20.712784
},
{
"name": "London",
"country":"UK",
"lon": -13.948753,
"lat": 10.712784
}
}
puis le comparer à une structure arborescente en XML qui pourrait ressembler à ceci:
<cities>
<country name="USA">
<city name="New York">
<long>-73.948753</long>
<lat>40.712784</lat>
</city>
<city name="Chicago">
<long>-23.948753</long>
<lat>20.712784</lat>
</city>
</country>
<country name="UK">
<city name="London">
<long>-13.948753</long>
<lat>10.712784</lat>
</city>
</country>
</cities>
La structure XML peut produire un temps plus rapide que celui de JSON car si je boucle à travers le nœud du Royaume-Uni pour trouver Londres, je n'ai pas à parcourir le reste des pays pour trouver ma ville. Dans l'exemple JSON, je le pourrais peut-être si Londres est près du bas de la liste. Mais ce que nous avons ici, c'est une différence de structure. Je serais surpris de constater que XML est plus rapide dans les deux cas ou dans un cas où les structures sont exactement les mêmes.
Ici est une expérience que j'ai faite en utilisant Python - Je sais que la question regarde cela strictement dans une perspective JavaScript, mais vous pourriez trouver cela utile. Les résultats montrent que JSON est plus rapide que XML, mais le point est le suivant: comment votre structure va avoir un effet sur l'efficacité avec laquelle vous pourrez la récupérer.
Une autre raison de s'en tenir à XML est que si vous passez en JSON, vous modifiez le "contrat de maintenance". XML est plus typé que JSON, dans le sens où il fonctionne plus naturellement avec les langages typés (c'est-à-dire PAS javascript).
Si vous passez à JSON, un futur responsable de la base de code pourrait introduire un tableau JSON à un moment donné qui a un contenu de type mixte (par exemple [ "Hello", 42, false ]
), qui posera un problème à tout code écrit dans un langage tapé.
Oui, vous pouvez le faire également en XML, mais cela nécessite des efforts supplémentaires, tandis qu'en JSON, il peut simplement se glisser.
Et même si cela ne semble pas être un gros problème à première vue, c'est en fait car il force le code dans le langage tapé à coller avec un arbre JSON au lieu de désérialiser en un type natif.
Analyser ou construire json est relativement facile qu'un xml et la plupart des langages fournissent également des méthodes pour un encodage et un décodage plus facile de json qui est quelque peu complexe avec xml.