2012-06-06 18 views
8

Tengo que almacenar alguna información de configuración en el archivo. En la configuración del código C#, los datos representan por clase y en archivo, voy a guardar esta clase en formato json o xml. Entonces, ¿cuál es el mejor rendimiento de serialización json o xml?serialización Json y Xml, ¿qué es un mejor rendimiento?

+0

busque en al siguiente post, que dice JSON [SO LNK] [1] [1]: http://stackoverflow.com/questions/7818926/data-efficiency- return-in-json-or-xml –

+1

En lugar de preguntar cuál es el más rápido, ¿por qué no preguntar cuál es el más apropiado? Los archivos de configuración XML son un estándar reconocido en el mundo .NET. Me gustaría ir al [principio de menor sorpresa] (http://en.wikipedia.org/wiki/Principle_of_least_astonishment) en esta instancia (por lo tanto, XML). –

+3

No estoy de acuerdo con todas las respuestas que dicen que JSON es menos legible para los humanos. Todo lo contrario. La J significa Javascript. Antes de que JSON siquiera fuera una cosa, estaba diseñado para ser escrito a mano y leído por ojo humano. XML no puede decir lo mismo, y es mucho menos legible. Pero, en cualquier caso, es FÁCIL encontrar el mejor rendimiento. Simplemente escriba su configuración en JSON y XML, luego escriba una función que serialice cada uno. Luego, usando la clase StopWatch, mida cuánto tiempo lleva realizar 1000 iteraciones de cada una. Ahora sabes cuál funciona mejor. – Wedge

Respuesta

16

Bueno en vez de adivinar, no tengo la respuesta. Aquí está el programa de prueba:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string xmlConfig = ""; 
     string jsonConfig = ""; 

     Config myConfig = new Config() 
     { 
      value = "My String Value", 
      DateStamp = DateTime.Today, 
      counter = 42, 
      Id = Guid.NewGuid() 
     }; 

     // Make both strings 
     DataContractSerializer xmlSerializer = new DataContractSerializer(typeof(Config)); 
     using (MemoryStream xmlStream = new MemoryStream()) 
     { 
      xmlSerializer.WriteObject(xmlStream, myConfig); 
      xmlConfig = Encoding.UTF8.GetString(xmlStream.ToArray()); 
     } 

     DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Config)); 
     using (MemoryStream jsonStream = new MemoryStream()) 
     { 
      jsonSerializer.WriteObject(jsonStream, myConfig); 
      jsonConfig = Encoding.UTF8.GetString(jsonStream.ToArray()); 
     } 

     // Test Single 
     var XmlSingleTimer = Stopwatch.StartNew(); 
     SerializeXML(xmlConfig, 1); 
     XmlSingleTimer.Stop(); 

     var JsonSingleTimer = Stopwatch.StartNew(); 
     SerializeJSON(jsonConfig, 1); 
     JsonSingleTimer.Stop(); 

     // Test 1000 
     var XmlTimer = Stopwatch.StartNew(); 
     SerializeXML(xmlConfig, 1000); 
     XmlTimer.Stop(); 

     var JsonTimer = Stopwatch.StartNew(); 
     SerializeJSON(jsonConfig, 1000); 
     JsonTimer.Stop(); 

     // Test 10000 
     var XmlTimer2 = Stopwatch.StartNew(); 
     SerializeXML(xmlConfig, 10000); 
     XmlTimer2.Stop(); 

     var JsonTimer2 = Stopwatch.StartNew(); 
      SerializeJSON(jsonConfig, 10000); 
     JsonTimer2.Stop(); 

     Console.WriteLine(String.Format("XML Serialization Single: {0}ms", XmlSingleTimer.Elapsed.TotalMilliseconds)); 
     Console.WriteLine(String.Format("JSON Serialization Single: {0}ms", JsonSingleTimer.Elapsed.TotalMilliseconds)); 
     Console.WriteLine(); 
     Console.WriteLine(String.Format("XML Serialization 1000: {0}ms", XmlTimer.Elapsed.TotalMilliseconds)); 
     Console.WriteLine(String.Format("JSON Serialization 1000: {0}ms ", JsonTimer.Elapsed.TotalMilliseconds)); 
     Console.WriteLine(); 
     Console.WriteLine(String.Format("XML Serialization 10000: {0}ms ", XmlTimer2.ElapsedMilliseconds)); 
     Console.WriteLine(String.Format("JSON Serialization 10000: {0}ms ", JsonTimer2.ElapsedMilliseconds)); 
    } 

    public static void SerializeXML(string xml, int iterations) 
    { 
     DataContractSerializer xmlSerializer = new DataContractSerializer(typeof(Config)); 
     for (int i = 0; i < iterations; i++) 
     { 
      using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(xml))) 
      { 
       Config serialized = (Config)xmlSerializer.ReadObject(stream); 
      } 
     } 
    } 

    public static void SerializeJSON(string json, int iterations) 
    { 
     DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Config)); 
     for (int i = 0; i < iterations; i++) 
     { 
      using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(json))) 
      { 
       Config serialized = (Config)jsonSerializer.ReadObject(stream); 
      } 
     } 
    } 
} 

public class Config 
{ 
    public string value; 
    public DateTime DateStamp; 
    public int counter; 
    public Guid Id; 
} 

Y esta es la salida medida:

XML Serialization Single: 2.3764ms 
JSON Serialization Single: 2.1432ms 

XML Serialization 1000: 13.7754ms 
JSON Serialization 1000: 13.747ms 

XML Serialization 10000: 100ms 
JSON Serialization 10000: 134ms 

JSON llegaron consistentemente a cabo sólo un poco más rápido después del 1 de iteración. Después de 1000 iteraciones, realmente no hubo diferencia. Después de 10000 iteraciones, XML fue claramente más rápido.

En este punto, no puede explicar por qué JSON sería más rápido uno a la vez, pero XML sería más rápido cuando se repite. Posiblemente debido al almacenamiento en caché o algo sofisticado en la biblioteca. Puede ver que el JsonSerializer escalado linealmente, aumentando las iteraciones en un orden de 10 aumentó linealmente el tiempo transcurrido en un orden de 10. Sin embargo, el XmlSerializer se comportó de manera diferente, su rendimiento no se escalo de forma lineal.

Lo repetí varias veces y siempre obtuve los mismos resultados.

Por lo tanto, la lección es que si solo está analizando un único objeto una vez, entonces JSON será un poco mejor. Pero si está analizando repetidamente objetos, XML podría funcionar mejor. Aunque no he probado lo que sucedería si los valores de los objetos cambian con cada iteración, eso podría marcar la diferencia.

También tenga en cuenta que estoy utilizando la biblioteca nativa Runtime.Serialization aquí. Es probable que otras bibliotecas produzcan resultados diferentes.

Editar: Lo intenté mientras generaba un nuevo Guid y un Int aleatorio cada vez que se llamaban las cadenas. No hizo ninguna diferencia en las pruebas de iteración individuales o 10000. Pero para 1000 iteraciones, JSON era aproximadamente 1 ms más rápido. Entonces, parece que el serializador XML realmente almacena en caché los valores.

+6

Sería increíble si 'Newtonsoft.Json' para la serialización JSON se usara ... :) – TryingToImprove

+3

Di todo el código, puede intentarlo usando cualquier serializador que desee;) – Wedge

1

El costo de serializar sería aproximadamente el mismo. Es poco probable que sea una diferencia notable. Utilice el formato que sus usuarios se sientan más cómodos modificando (ya que es un archivo de configuración).

La diferencia de rendimiento real puede producirse cuando necesite enviar JSON o XML a través de una red. Entonces, el rendimiento depende de la cantidad de material que envíe, y como JSON suele ser más conciso que XML, generalmente tendrá un mejor rendimiento en una red.

+2

A menos que, por supuesto, la compresión esté habilitada o que utilicen XML binario. Demasiadas suposiciones no declaradas en la pregunta de OP para mi gusto. –

2

JSON puede ser somethimes menos legible por humanos que xml, pero el tamaño del archivo generado por JSON es más pequeña. Entonces, si necesita enviar el archivo a través de la red, Json puede ser la mejor opción, o si desea poder leerlo, XML es mejor. Otra cosa buena es que en .NET 4 tienes la palabra clave dinámica, y puedes convertir tu Json directamente en un objeto C#.

+1

¡Encuentro json mucho más legible que XML! – Arijoon

+0

@Arijoon wow ... comentario de 5 años :) de todos modos, últimamente trabajé en aplicaciones web, y ahora me parece más legible ya que estoy más acostumbrado y el editor es más inteligente en estos días (puede colapsar secciones json, etc.) . a excepción de 1 caso: cuando tiene un valor que contiene texto con nuevas líneas. realmente no se puede formatear el valor de texto json para que contenga una nueva línea, tiene que agregar \ n. entonces, ves una línea grande que contiene \ n en ella. –

6

Cuando voy a buscar para la configuración de una aplicación .NET, espero encontrar un archivo XML en algún lugar llamado MyApp.exe.config.

Si seguimos con el principle of least surprise yo estaría a favor de serialización XML a través de JSON. Existe un beneficio adicional de que la configuración con formato XML se puede adaptar para trabajar con el Configuration API. Tanto de lo contrario tener el mismo tipo de apoyo: independiente de la plataforma, analizadores decente, basado en texto, etc.

El rendimiento es sólo un problema cuando se convierte en un problema. Soy un fanático de identificar problemas potenciales antes de codificarlos, pero eso generalmente se trata de problemas de rendimiento introducidos por decisiones arquitectónicas. Algo como esto, pequeño y bastante autónomo, no será difícil de cambiar si resulta ser un problema bajo el perfil.

Cuestiones relacionadas