2011-01-04 20 views
52

Sto creando una sofisticata libreria JavaScript per lavorare con il framework lato server della mia azienda.È l'analisi di JSON più veloce dell'analisi XML

Il framework lato server codifica i dati in un semplice formato XML. Non c'è un elegante namespace o qualcosa del genere.

Idealmente mi piacerebbe analizzare tutti i dati nel browser come JSON. Tuttavia, se faccio questo ho bisogno di riscrivere parte del codice lato server per sputare anche JSON. Questo è un problema perché abbiamo API pubbliche che non posso cambiare facilmente.

Quello che mi preoccupa molto qui sono le prestazioni nel browser di analisi di JSON contro XML. C'è davvero una grande differenza di cui preoccuparsi? O dovrei andare esclusivamente per JSON? Qualcuno ha qualche esperienza o benchmark nella differenza di prestazioni tra i due?

Mi rendo conto che gli sviluppatori Web più moderni probabilmente opterebbero per JSON e posso capire perché. Tuttavia, sono davvero interessato alle prestazioni. Se c'è una grossa differenza dimostrata, sono pronto a dedicare uno sforzo extra alla generazione di server JSON per il client.

risposta

31

JSON dovrebbe essere più veloce poiché è JS Notazione oggetto, il che significa che può essere riconosciuto in modo nativo da JavaScript. In PHP sul lato GET delle cose, io spesso fare qualcosa di simile:

<script type="text/javascript"> 
    var data = <?php json_encode($data)?>; 
</script> 

Per ulteriori informazioni su questo, vedere qui:

Why is Everyone Choosing JSON Over XML for jQuery?

anche ... quello "sforzo supplementare "devi davvero mettere in" generare "JSON? Sicuramente non puoi dire che costruirai manualmente la stringa JSON? Quasi tutti i linguaggi moderni sul lato server dispongono di librerie che convertono le variabili native in stringhe JSON. Ad esempio, la funzione principale json_encode PHP converte un array associativo simili:

$data = array('test'=>'val', 'foo'=>'bar'); 

in

{"test": "val", "foo": "bar"} 

che è semplicemente un oggetto JavaScript (non essendoci array associativi (in senso stretto) in JS).

+9

Inoltre, (come indicato nella domanda collegata), JSON è generalmente più leggero semplicemente in termini di byte, rendendolo più efficiente da trasmettere. Molto probabilmente, si otterrà un vantaggio in termini di prestazioni molto maggiore dalla riduzione dei requisiti di larghezza di banda rispetto a qualsiasi differenza nell'analisi di JSON rispetto a XML. –

+1

Credo che json_encode/decode debba essere abilitato quando PHP è compilato. – Alexander

+0

@ Alexander: non ho mai dovuto farlo prima. Funziona sempre e basta. – treeface

2

poiché JSON è nativo e progettato per Javascript, supererà l'analisi XML per tutto il giorno. non hai menzionato il tuo linguaggio lato server, in PHP c'è la funzionalità json_encode/json_decode integrata nel core PHP ...

1

la differenza di performance sarà così piccola che non ti accorgerai nemmeno di : non dovresti pensare a problemi di prestazioni finché non hai problemi di prestazioni - ci sono molti altri punti importanti da tenere in considerazione: codice manutenibile, leggibile e documentato ...).

ma, per rispondere a una tua domanda: JSON sarà più veloce da analizzare (perché è semplice notazione oggetto javascript).

+1

Questa differenza riguarda solo piccole quantità di dati. Se stai analizzando più di un paio di dozzine di righe (o giù di lì), allora ci sarà sicuramente una notevole quantità di tempo speso nell'analisi dei dati. – Alexander

8

I benchmark sono stati eseguiti. Here's one. La differenza in alcuni dei browser precedenti sembrava essere un intero ordine di grandezza (dell'ordine di 10 secondi di millisecondi anziché di 100 secondi di ms), ma non enorme. Parte di questo è il tempo di risposta del server - XML ​​è più ingombrante come formato di dati. Parte di esso è il tempo di analisi: JSON consente di inviare oggetti JavaScript, mentre XML richiede l'analisi di un documento.

Si potrebbe considerare di aggiungere alla propria API pubblica un metodo per restituire JSON invece di modificare le funzioni esistenti se questo diventa ed è problematico, a meno che non si voglia esporre il JSON.

Vedi anche la domanda SO When to prefer JSON over XML?

+2

Minor nitpick, wrt "JSON consente di inviare oggetti JavaScript, mentre XML richiede l'analisi di un documento" - questo non è proprio vero; entrambi devono essere scritti e letti (serialize/deserialize, marshal/unmarshal), poiché tutti i dati vengono inviati come flusso di byte. È vero, tuttavia, che la struttura dei dati creata per JSON è più naturale rispetto agli alberi DOM XML. – StaxMan

+0

@StaxMan - grazie per la correzione. La risposta tecnica che intendevo implicare era che JSON sul lato client può essere "valutato" su un oggetto (con i soliti avvertimenti dell'applicazione dell'eval), mentre l'albero DOM per XML deve essere analizzato. – justkt

+0

Ricorda che la maggior parte dei browser ha parser XML incorporati – qwertymk

4

prestazioni in realtà non è una considerazione, partendo dal presupposto che non si sta parlando di gigabyte di XML. Sì, ci vorrà più tempo (XML è più dettagliato), ma non sarà qualcosa che l'utente noterà.

Il vero problema, a mio parere, è il supporto per XML in JavaScript. E4X è bello, ma non è supportato da Microsoft. Quindi dovrai usare una libreria di terze parti (come JQuery) per analizzare l'XML.

+3

Se il downvoter si preoccupasse di commentare ... – Anon

+2

Non ero io, ma una cosa che vorrei sottolineare è che l'analisi XML può già essere eseguita dalla richiesta AJAX; l'xml risultante è accessibile direttamente come albero DOM. O forse stavi pensando al data binding da DOM (che è costruito da parsed xml) a oggetti Javascript "reali"? – StaxMan

1

In questa situazione, direi bastone con l'XML. Tutti i principali browser hanno un'interfaccia di analisi DOM che analizzerà XML ben formato. Questo collegamento mostra un modo per utilizzare l'interfaccia DOMParser in Webkit/Opera/Firefox e l'oggetto DOM ActiveX in IE: https://sites.google.com/a/van-steenbeek.net/archive/explorer_domparser_parsefromstring

+3

Tutti i browser (con il corretto supporto JavaScript) sono in grado di analizzare il codice JSON ben formato proprio come XML. – Alexander

+1

@Alexander: di sicuro. Non stavo insinuando che non lo fossero, solo che ha affermato che il passaggio a JSON sul lato server è un'attività non banale a causa delle interfacce API e così via, quindi ho consigliato di attenermi invece all'XML. –

+0

@Alex Vidal, Anche se normalmente acconsento, se lui/lei sta pianificando di scrivere per codice basato su XML, potrebbe essere semplicemente meglio convertire in JSON ora, quindi non è necessario riscrivere più codice. – Alexander

2

Se possibile, sarebbe opportuno misurarlo. Con "se possibile" intendo che gli strumenti per javascript (specialmente per l'analisi delle prestazioni) potrebbero non essere altrettanto validi dei linguaggi di programmazione autonomi.

Perché misurare? Perché la speculazione basata esclusivamente sulle proprietà dei formati di dati non è molto utile per l'analisi delle prestazioni - le intuizioni degli sviluppatori sono notoriamente scarse nel predire le prestazioni. In questo caso significa solo che tutto dipende dalla maturità dei rispettivi parser XML e JSON (e generatori) in uso. XML ha il vantaggio di essere stato in giro più a lungo; JSON è un po 'più semplice da elaborare. Questo basato sull'aver effettivamente scritto librerie per l'elaborazione di entrambi. Alla fine, se tutte le cose sono uguali (maturità e ottimizzazione delle prestazioni delle librerie), JSON può effettivamente essere leggermente più veloce da elaborare. Ma entrambi possono essere molto veloci; o molto lento con cattive implementazioni.

Tuttavia: ho il sospetto che non dovresti preoccuparti troppo delle prestazioni, come molti hanno già suggerito. Sia xml che json possono essere analizzati in modo efficiente, e con i browser moderni, probabilmente lo sono. È probabile che se si verificano problemi di prestazioni non è con la lettura o la scrittura di dati, ma qualcos'altro; e il primo passo sarebbe in realtà capire qual è il vero problema.

18

In primo luogo, vorrei dire grazie a tutti coloro che hanno risposto alla mia domanda. Io apprezzo davvero tutte le tue risposte.

Riguardo a questa domanda, ho condotto ulteriori ricerche eseguendo alcuni benchmark. L'analisi avviene nel browser. IE 8 è l'unico browser che non ha un parser JSON nativo. L'XML è gli stessi dati della versione JSON.

Chrome (versione 8.0.552.224), JSON: 92ms, XML: 90ms

Firefox (versione 3.6.13), JSON: 65ms, XML: 129ms

IE (versione 8.0.6001.18702), JSON: 172 ms, XML: 125 ms

È interessante notare che Chrome sembra avere quasi la stessa velocità. Si noti che questo sta analizzando molti dati. Con pochi frammenti di dati, questo non è probabilmente un grosso problema.

+5

Sarei molto interessato a vedere un aggiornamento di questo con Firefox 9+ e Chrome 16+ – HDave

+1

Strani risultati, dalla mia esperienza json era sempre molto, molto più veloce nei browser. hai alcuni dati specifici, in cui l'overhead xml non è molto paragonato ai dati stessi, ma, se funziona in questo modo, allora deve essere vero. Non puoi mai presumere qualcosa, dovresti sempre provare. –

+0

I don ' Penso che questi benchmark siano accurati: come @justkt ha condiviso la sua risposta, [questo link] (http://www.navioo.com/ajax/ajax_json_xml_Benchmarking.php) ha un buon confronto tra di loro: – scaryguy

1

L'analisi o la costruzione di json è relativamente semplice rispetto a un xml e anche la maggior parte delle lingue fornisce metodi per semplificare la codifica e la decodifica di JSON, che è piuttosto complessa con xml.

1

Dipende anche da come è strutturato il tuo JSON. Le strutture ad albero tendono ad analizzare in modo più efficiente di una lista di oggetti. È qui che la comprensione fondamentale delle strutture dati sarà utile. Non sarei sorpreso se si analizza una struttura di lista come in JSON che potrebbe assomigliare a questo:

{ 
     { 
      "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 
     } 
} 

e poi paragonarlo ad un albero come la struttura in XML che potrebbe essere simile a questo:

<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 struttura XML può produrre un tempo più veloce di quello di JSON poiché se faccio un giro del Regno Unito per trovare Londra, non devo fare il giro del resto dei paesi per trovare la mia città. Nell'esempio JSON, potrei solo se Londra è vicina alla fine dell'elenco. Ma quello che abbiamo qui è una differenza nella struttura. Sarei sorpreso di scoprire che XML è più veloce in entrambi i casi o in un caso in cui le strutture sono esattamente le stesse.

Here è un esperimento che ho fatto usando Python - so che la domanda è guardando questo rigorosamente da una prospettiva JavaScript, ma potresti trovarlo utile. I risultati mostrano che JSON è più veloce di XML. Tuttavia, il punto è: in che modo la struttura avrà un effetto sul modo in cui si è in grado di recuperarla.

+0

@geme_hendrix Penso che JSON ben strutturato sarà più veloce nella maggior parte dei casi. Grande domanda però. –

Problemi correlati