Perché la serializzazione binaria è considerata più rapida della serializzazione xml?Perché la serializzazione binaria è più veloce della serializzazione xml?
risposta
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 .
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
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. –
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
@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) –
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 ...)
- 1. serializzazione C++ più veloce?
- 2. La serializzazione XML è lenta
- 3. Serializzazione XML della lista
- 4. Perché utilizziamo la serializzazione?
- 5. Quando utilizzare la serializzazione XML o la serializzazione binaria nel framework .NET?
- 6. Metadati di serializzazione binaria .NET
- 7. Libreria di serializzazione binaria Scala
- 8. Perché utilizzare la serializzazione
- 9. Serializzazione binaria/de-serializzazione in C++ e C#
- 10. Serializzazione binaria degli oggetti C#
- 11. Quali dati vengono passati in serializzazione? (Serializzazione binaria)
- 12. Serializzazione Xml senza eliminazione
- 13. Immutabilità e serializzazione XML
- 14. Serializzazione Xml in C#
- 15. serializzazione XML + Namespace (C#)
- 16. - Serializzazione da XML a XML
- 17. Serializzazione veloce/deserializzazione delle strutture
- 18. xml condizionale serializzazione
- 19. Serializzazione XML Scala
- 20. serializzazione xml - rimuovi namespace
- 21. La serializzazione XML genera nodi duplicati
- 22. JSON.Net La serializzazione Xml fraintende gli array
- 23. Portabilità della serializzazione binaria di tipo double/float in C++
- 24. nome Change XmlElement per la serializzazione XML
- 25. Come utilizzare la serializzazione XML predefinita da metodi di serializzazione XML personalizzati
- 26. Serializzazione Python - Perché pickle?
- 27. Come personalizzare la serializzazione XML WCF
- 28. Serializzazione più oggetti
- 29. Dovrei preoccuparmi della codifica durante la serializzazione?
- 30. serializzazione XML - XmlCDataSection come Serialization.XmlText
Si prega di chiarire la vostra domanda. Stai chiedendo se uno è più veloce dell'altro, o perché uno è più veloce dell'altro? – Oded