Escribí un programa para serializar una clase 'Persona' utilizando XMLSerializer, BinaryFormatter y ProtoBuf. Pensé que protobuf-net debería ser más rápido que los otros dos. La serialización de Protobuf fue más rápida que XMLSerialization pero mucho más lenta que la serialización binaria. ¿Es mi entendimiento incorrecto? Por favor hazme entender esto Gracias por la ayuda.protobuf-net ¿NO es más rápido que la serialización binaria?
EDITAR: - Cambié el código (actualizado a continuación) para medir el tiempo solo para la serialización y no crear las secuencias y seguir viendo la diferencia. ¿Podría uno decirme por qué?
A continuación se presenta la salida: -
persona recibió creado usando búfer de protocolo en 347 milisegundos
persona recibió creado usando XML en 1462 milisegundos
persona recibió creado usando binario en 2 milisegundos
Código debajo de
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ProtoBuf;
using System.IO;
using System.Diagnostics;
using System.Runtime.Serialization.Formatters.Binary;
namespace ProtocolBuffers
{
class Program
{
static void Main(string[] args)
{
string folderPath = @"E:\Ashish\Research\VS Solutions\ProtocolBuffers\ProtocolBuffer1\bin\Debug";
string XMLSerializedFileName = Path.Combine(folderPath,"PersonXMLSerialized.xml");
string ProtocolBufferFileName = Path.Combine(folderPath,"PersonProtocalBuffer.bin");
string BinarySerializedFileName = Path.Combine(folderPath,"PersonBinary.bin");
if (File.Exists(XMLSerializedFileName))
{
File.Delete(XMLSerializedFileName);
Console.WriteLine(XMLSerializedFileName + " deleted");
}
if (File.Exists(ProtocolBufferFileName))
{
File.Delete(ProtocolBufferFileName);
Console.WriteLine(ProtocolBufferFileName + " deleted");
}
if (File.Exists(BinarySerializedFileName))
{
File.Delete(BinarySerializedFileName);
Console.WriteLine(BinarySerializedFileName + " deleted");
}
var person = new Person
{
Id = 12345,
Name = "Fred",
Address = new Address
{
Line1 = "Flat 1",
Line2 = "The Meadows"
}
};
Stopwatch watch = Stopwatch.StartNew();
using (var file = File.Create(ProtocolBufferFileName))
{
watch.Start();
Serializer.Serialize(file, person);
watch.Stop();
}
//Console.WriteLine(watch.ElapsedMilliseconds.ToString());
Console.WriteLine("Person got created using protocol buffer in " + watch.ElapsedMilliseconds.ToString() + " milliseconds ");
watch.Reset();
System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(person.GetType());
using (TextWriter w = new StreamWriter(XMLSerializedFileName))
{
watch.Start();
x.Serialize(w, person);
watch.Stop();
}
//Console.WriteLine(watch.ElapsedMilliseconds.ToString());
Console.WriteLine("Person got created using XML in " + watch.ElapsedMilliseconds.ToString() + " milliseconds");
watch.Reset();
using (Stream stream = File.Open(BinarySerializedFileName, FileMode.Create))
{
BinaryFormatter bformatter = new BinaryFormatter();
//Console.WriteLine("Writing Employee Information");
watch.Start();
bformatter.Serialize(stream, person);
watch.Stop();
}
//Console.WriteLine(watch.ElapsedMilliseconds.ToString());
Console.WriteLine("Person got created using binary in " + watch.ElapsedMilliseconds.ToString() + " milliseconds");
Console.ReadLine();
}
}
[ProtoContract]
[Serializable]
public class Person
{
[ProtoMember(1)]
public int Id { get; set; }
[ProtoMember(2)]
public string Name { get; set; }
[ProtoMember(3)]
public Address Address { get; set; }
}
[ProtoContract]
[Serializable]
public class Address
{
[ProtoMember(1)]
public string Line1 { get; set; }
[ProtoMember(2)]
public string Line2 { get; set; }
}
}
Unas pocas notas rápidas - en primer lugar, tratar de reducir la influencia de factores externos en su prueba. Serializar en una secuencia de memoria u otro objetivo relativamente neutral en relación con el rendimiento del sistema de archivos. En segundo lugar, solo debe medir el tiempo de la operación de serialización; no incluya la creación de las secuencias o la construcción de objetos. Tercero, repita sus pruebas un número razonable de veces e informe los resultados agregados. –
Gracias por los comentarios. Usted mencionó "objetivos relativamente neutrales en cuanto al rendimiento en lugar del sistema de archivos". Qué significa eso? ¿podría darnos algunos ejemplos de un "objetivo relativamente neutral respecto al rendimiento"? Gracias. –
@Ashish - Estaba pensando principalmente en un flujo de memoria. El entorno * podría * Todavía afectar sus pruebas si serializa a una secuencia de memoria (por ejemplo, la presión de memoria te puede obligar a ir a la memoria virtual para una prueba y no el otro), pero creo que sería menos probable que influyen en su resultados que el sistema de archivos. En retrospectiva, ** probablemente sea más importante repetir las pruebas que tratar de obtener condiciones de prueba absolutamente neutras **, pero luchar por esas condiciones no hará daño. ;) –