Ich schrieb ein Programm, um eine 'Person'-Klasse mit XMLSerializer, BinaryFormatter und ProtoBuf zu serialisieren. Ich dachte protobuf-net sollte schneller sein als die anderen beiden. Die Protobuf-Serialisierung war schneller als die XML-Serialisierung, aber viel langsamer als die Binärserialisierung. Ist mein Verständnis falsch? Bitte lass mich das verstehen. Danke für die Hilfe.protobuf-net NICHT schneller als binäre Serialisierung?
EDIT: - Ich änderte den Code (aktualisiert unten), um die Zeit nur für die Serialisierung zu messen und nicht die Streams zu erstellen und immer noch den Unterschied zu sehen. Kann mir einer sagen warum?
Im Anschluss an die Ausgabe: -
Person wurde unter Verwendung von Protokollpuffer in 347 Millisekunden erstellt
Person wurde unter Verwendung von XML in 1462 Millisekunden erstellt
Person wurde unter Verwendung von binären in 2 Millisekunden erstellt
Code unter
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; }
}
}
Ein paar schnelle Notizen - zuerst versuchen, Reduzieren Sie den Einfluss externer Faktoren auf Ihren Test. Serialisierung in einen Speicherstream oder ein anderes relativ leistungsneutrales Ziel anstelle des Dateisystems. Zweitens sollten Sie nur die Serialisierungszeit angeben - schließen Sie nicht die Erstellung Ihrer Streams oder die Konstruktion von Objekten ein. Drittens, wiederholen Sie Ihre Tests eine angemessene Anzahl von Malen und melden Sie die aggregierten Ergebnisse. –
Danke für die Kommentare. Sie haben "relativ leistungsneutrales Ziel und nicht das Dateisystem" erwähnt. Was bedeutet das? Könnten Sie bitte einige Beispiele für ein "relativ leistungsneutrales Ziel" nennen? Vielen Dank. –
@Ashish - Ich dachte in erster Linie an einen Gedächtnisstrom. Die Umgebung * könnte sich immer noch auf Ihre Tests auswirken, wenn Sie in einen Speicherstream serialisieren (zum Beispiel könnte der Speicherdruck Sie zwingen, für einen Test in den virtuellen Speicher zu gehen und nicht in den anderen), aber ich denke, es wäre weniger wahrscheinlich, Ihren zu beeinflussen Ergebnisse als das Dateisystem. Im Nachhinein ** ist es wahrscheinlich wichtiger, Ihre Tests zu wiederholen, als absolut neutrale Testbedingungen ** zu bekommen, aber das Streben nach diesen Bedingungen wird nicht schaden. ;) –