Performance: BinaryFormatter vs XmlSerializer

Je lis très souvent que le BinaryFormatter a de meilleures performances, alors XmlSerializer.
Par curiosité, j'ai écrit un test-app.

un wtf moment... pourquoi Xml est beaucoup plus rapide que celle de la Corbeille (en particulier la désérialisation)?

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; }
}
}

mes résultats:

Bin: 13472.7706
Bin-D: 121131.9284
Xml: 8917.51
Xml-D: 12841.7345
La désérialisation est beaucoup plus lent que la sérialisation. Pouvez-vous modifier votre échantillon de de faire les deux? Qui sera beaucoup plus intéressante comparaison.
Salut, je considère que l'exécution de certains de vos tests multiples (100+?) fois avec le démarrage (création de formateurs/sérialiseurs) inclus dans la boucle ou sans. Calendrier le résultat de beaucoup plus de points peut vous donner une image plus précise de la performance. Pensez également à utiliser le Chronomètre en classe pour faire le calendrier de trop car je crois qu'il utilise à la haute performance de la minuterie où poss. Si vous obtenez encore plus rapide de la sérialisation XML, il serait bon de savoir pourquoi!
J'ai toujours compris que le binaire est "plus rapide" à l'égard de transfert réseau, car elles contiennent moins d'octets. Je m'attends à ce qu'il serait prendre une assez lourde charge pour la différence, d'être évident.
J'ai essayé le Chronomètre de la classe, et les résultats ont été les mêmes.

OriginalL'auteur Lukas | 2010-08-22