2010-10-11 36 views

risposta

8

La serializzazione binaria è più efficiente perché scrive direttamente i dati non elaborati e l'XML ha bisogno del formato e analizza i dati per generare una struttura XML valida, inoltre a seconda del tipo di dati che hanno gli oggetti XML può avere molti dati ridondanti .

11

consideri serializzazione doppia per esempio:

  • serializzazione binaria: crei 8 byte di indirizzo di memoria nel flusso

  • binario deserializzazione: lettura stessa 8 byte

  • serializzazione XML: scrittura tag, conversione in testo, scrittura tag di chiusura - quasi tre volte l'I/O e 1000 volte più utilizzo della CPU

  • deserializzazione xml: lettura/convalida tag, lettura stringa parsing al numero, lettura/validazione del tag di chiusura. poco più in alto per l'I/O e un po 'di più per CPU

+2

Si potrebbe anche menzionare la gestione della memoria per gli oggetti stringa tipicamente creati durante la serializzazione o deserializzazione di formati di testo. Questo può spingere le cose fuori dalle cache della CPU, o causare l'avvio di algoritmi di raccolta dei dati inutili o il thrash. –

8

In realtà, come tutte le cose - esso dipende dai dati, e il serializzatore.

Comunemente (anche se forse incautamente) persone significare BinaryFormatter per "binario", ma questo ha un certo numero di punti deboli:

  • in aggiunge un sacco di tipo metadati (che tutto prende spazio)
  • di default include nomi di campo (che possono essere dettagliato, specialmente per le proprietà implementate automaticamente)

contrario, xML ha generalmente spese generali quali:

  • tag aggiungendo spazio e IO
  • la necessità di analizzare tag (che è notevolmente costoso)
  • lotti di codifica di testo/decodifica

Naturalmente, XML è facilmente compressi, aggiungendo CPU ma estremamente riducendo la larghezza di banda.

Ma questo non significa che uno è più veloce; Vi rimando ad alcune statistiche di esempio from here (con sorgente completa inclusa), a cui ho annotato la base del serializzatore (binario, xml, testo, ecc.). Guarda in particolare i primi due risultati; assomiglia a XmlSerializer trionfato BinaryFormatter su ogni valore, pur mantenendo i vantaggi multipiattaforma. Naturalmente, protobuf trionfa quindi XmlSerializer; p

Questi numeri si legano abbastanza bene a ServiceStack's benchmarks, here.

BinaryFormatter *** binary 
Length: 1314 
Serialize: 6746 
Deserialize: 6268 

XmlSerializer *** xml 
Length: 1049 
Serialize: 3282 
Deserialize: 5132 

DataContractSerializer *** xml 
Length: 911 
Serialize: 1411 
Deserialize: 4380 

NetDataContractSerializer *** binary 
Length: 1139 
Serialize: 2014 
Deserialize: 5645 

JavaScriptSerializer *** text (json) 
Length: 528 
Serialize: 12050 
Deserialize: 30558 

(protobuf-net v2) *** binary 
Length: 112 
Serialize: 217 
Deserialize: 250 
+0

@FrankHileman sfortunatamente le persone si appoggiano ancora su di esso di default, quindi è * necessario * confrontarlo, anche se sta giocando una partita diversa su un campo diverso (e tutti gli altri sono nella piscina) –

1

Beh, prima di tutto, XML è un formato gonfiato. Ogni byte che si invia in forma binaria sarebbe simile ad almeno 2 o 3 byte in XML. Ad esempio, inviando il numero "44" in binario, è necessario un solo byte.In XML hai bisogno di un tag elemento, più due byte per mettere il numero: <N>44</N> che è molto più dati.
Una differenza è il tempo di codifica/decodifica richiesto per gestire il messaggio. Dato che i dati binari sono così compatti, non mangeranno molti cicli di clock. Se i dati binari sono una struttura fissa, è probabile che tu possa caricarli direttamente in memoria e accedere ad ogni elemento da esso senza la necessità di analizzare/eseguire una spunta dei dati.
XML è un formato basato sul testo che richiede alcuni passaggi aggiuntivi per essere elaborato. Innanzitutto, il formato è gonfio, quindi consuma più memoria. Inoltre, tutti i dati sono di testo e potrebbero essere necessari in formato binario, quindi l'XML deve essere analizzato. Questa analisi richiede ancora tempo per l'elaborazione, indipendentemente dalla velocità del codice. ASN.1 è un formato "XML binario" che fornisce una buona alternativa per XML, ma che dovrà essere analizzato proprio come XML. Inoltre, se la maggior parte dei dati utilizzati è testo, non numerico, i formati binari non faranno una grande differenza.
Un altro fattore di velocità è la dimensione totale dei dati. Quando carichi e salvi un file binario di 1 KB o un file XML di 3 KB, probabilmente non noterai alcuna differenza di velocità. Questo perché i dischi utilizzano blocchi di dimensioni specifiche per memorizzare i dati. Fino a 4 KB si adatta facilmente alla maggior parte dei blocchi di dischi. Pertanto, per il disco non ha importanza se deve leggere 1 KB o 3 KB poiché legge l'intero blocco 4KB. Ma quando il file binario è di 1 megabyte e l'XML è di 3 megabyte, il disco dovrà leggere molti più blocchi per leggere solo l'XML. (O per scriverlo.) E poi importa anche se il tuo XML è di 3 MB o solo 2,99 MB o 3,01 MB.
Con il trasporto su TCP/IP, la maggior parte dei dati binari sarà codificata UU. Con la codifica UU, i dati binari cresceranno con 1 byte ogni 3 byte nei dati. I dati XML non verranno codificati, quindi la differenza di dimensione diminuirà, quindi la differenza di velocità diminuirà. Tuttavia, i dati binari saranno ancora più veloci poiché le routine di codifica/decodifica possono essere molto veloci.
Fondamentalmente, le dimensioni contano. :-)

Ma con XML hai un'alternativa aggiuntiva. È possibile inviare e archiviare l'XML in un formato di file ZIP. Microsoft Office fa questo con le sue versioni più recenti. Un documento Word viene creato come un file XML, ma memorizzato come parte di un file ZIP più grande. Questo combina il meglio di entrambi i mondi, poiché i documenti di Word sono per lo più di testo, quindi un formato binario non aumenterebbe molto la velocità. Zippare l'XML rende l'archiviazione e l'invio dei dati molto più veloce semplicemente rendendola binaria. Ancora più interessante, un file XML compresso potrebbe finire per essere più piccolo di un file binario non compresso, quindi l'XML zippato diventa il più veloce. (Ma è imbroglio dal momento che XML è ora binario ...)

Problemi correlati