He leído muy a menudo que BinaryFormatter tiene un mejor rendimiento que XmlSerializer. Por curiosidad, escribí una aplicación de prueba.Rendimiento: BinaryFormatter frente a XmlSerializer
un momento wtf ... ¿por qué Xml es mucho más rápido que Bin (especialmente la deserialización)?
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Xml.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
namespace SerPlayground
{
class Program
{
static void Main(string[] args)
{
var items = new List<TestClass>();
for (int i = 0; i < 1E6; i++)
{
items.Add(new TestClass() { Name = i.ToString(), Id = i });
}
File.Delete("test.bin");
using (var target = new FileStream("test.bin", FileMode.OpenOrCreate))
{
System.Threading.Thread.Sleep(1000);
var bin = new BinaryFormatter();
var start = DateTime.Now;
bin.Serialize(target, items);
Console.WriteLine("Bin: {0}", (DateTime.Now - start).TotalMilliseconds);
target.Position = 0;
System.Threading.Thread.Sleep(1000);
start = DateTime.Now;
bin.Deserialize(target);
Console.WriteLine("Bin-D: {0}", (DateTime.Now - start).TotalMilliseconds);
}
File.Delete("test.xml");
using (var target = new FileStream("test.xml", FileMode.OpenOrCreate))
{
System.Threading.Thread.Sleep(1000);
var xml = new XmlSerializer(typeof(List<TestClass>));
var start = DateTime.Now;
xml.Serialize(target, items);
Console.WriteLine("Xml: {0}", (DateTime.Now - start).TotalMilliseconds);
target.Position = 0;
System.Threading.Thread.Sleep(1000);
start = DateTime.Now;
xml.Deserialize(target);
Console.WriteLine("Xml-D: {0}", (DateTime.Now - start).TotalMilliseconds);
}
Console.ReadKey();
}
}
[Serializable]
public class TestClass
{
public string Name { get; set; }
public int Id { get; set; }
}
}
mis resultados:
Bin: 13472.7706
Bin-D: 121131.9284
Xml: 8917.51
Xml-D: 12841.7345
Deserialización es mucho más lenta que la serialización. ¿Puedes modificar tu muestra para hacer ambas cosas? Esa será una comparación mucho más interesante. –
Hola, Consideraría ejecutar algunas de sus pruebas varias veces (más de 100 veces), ya sea con el inicio (creando los formateadores/serializadores) incluido en el ciclo o sin él. La sincronización del resultado de muchas más ejecuciones puede proporcionarle una imagen más precisa del rendimiento. También considere usar la clase StopWatch para hacer los tiempos, ya que creo que usa el temporizador de alto rendimiento donde sea posible. Si aún obtiene una serialización XML más rápida, ¡sería bueno saber por qué también! – Jennifer
Siempre he entendido que el binario es "más rápido" con respecto a la transferencia de red, ya que contendrá menos bytes. Sin embargo, esperaría que llevara una carga útil bastante alta para que la diferencia sea evidente. – kbrimington