Ich lese sehr oft, dass der BinaryFormatter eine bessere Leistung als XmlSerializer hat. Aus Neugier habe ich eine Test-App geschrieben.Leistung: BinaryFormatter vs XmlSerializer
ein wtf Moment ... Warum ist Xml so viel schneller als Bin (vor allem die Deserialisierung)?
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; }
}
}
meine Ergebnisse:
Bin: 13472.7706
Bin-D: 121131.9284
Xml: 8917.51
Xml-D: 12841.7345
Deserialisierung weit langsamer als Serialisierung ist. Können Sie Ihre Probe ändern, um beides zu tun? Das wird ein viel interessanterer Vergleich sein. –
Hallo, Ich würde in Betracht ziehen, einige Ihrer Tests mehrere (100+?) Mal - entweder mit dem Start (Erstellen der Formatierer/Serialisierer) in der Schleife enthalten oder ohne. Timing das Ergebnis von vielen weiteren Läufen können Sie ein genaueres Bild der Leistung geben. Erwägen Sie auch, die StopWatch-Klasse zu verwenden, um das Timing zu tun, da ich glaube, dass es den Hochleistungszeitgeber wo möglich verwendet. Wenn Sie immer noch eine schnellere XML-Serialisierung erhalten, wäre es gut zu wissen, warum auch! – Jennifer
Ich habe immer verstanden, dass Binär ist "schneller" in Bezug auf die Netzwerkübertragung, da es weniger Bytes enthalten wird. Ich würde erwarten, dass es eine ziemlich starke Nutzlast braucht, um den Unterschied zu erkennen. – kbrimington