Serialization – Tidsjämförelser (Soap, JS, Binary)

Gillar ju att testa kodexekveringstider då det känns dumt att göra en sak som tar 10 sekunder när det går att göra på 3. Så var lite nyfiken på skillnaderna när det gäller att serialisera och deserialisera strängar och objekt.

Jämförde SoapFormatter, BinaryFormatter och JavaScriptSerializer. Enligt pseudo koden:

Iterera 10 gånger
{
Iterera 1000 ggr
{
string s = serialisera(objekt);
objekt o = deserialisera(s);
}
}

Kod för serialisering / deserialisering.

SoapFormatter:
private Member DeserialSoap(string input)
{
using (Stream stream = new MemoryStream())
{
foreach (char c in input.ToCharArray())
{
stream.WriteByte(Convert.ToByte(c));
}
stream.Seek(0, SeekOrigin.Begin);
SoapFormatter formatter = new SoapFormatter();
Member m = (Member)formatter.Deserialize(stream);
stream.Close();
return m;
}
}
private string SerializeSoapString(Member m)
{
using (MemoryStream oStream = new MemoryStream())
{
(new SoapFormatter()).Serialize(oStream, m);
return Encoding.Default.GetString(oStream.ToArray());
}
}

BinaryFormatter:
private Member DeserialBinary(string s)
{
using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(s)))
{
return (Member) new BinaryFormatter().Deserialize(ms);
}

}
private string SerialBinary(Member m)
{
using (MemoryStream s = new MemoryStream())
{
new BinaryFormatter().Serialize(s, m);
return Convert.ToBase64String(s.ToArray());
}
}
JavaScriptSerializer:
private Member DeserialJS(string s)
{
return (Member) new JavaScriptSerializer().Deserialize(s, typeof(Member));
}
private string SerialJS(Member m)
{
return new JavaScriptSerializer().Serialize(m);
}

Fick 10 mätpunkter för varje 10000’e iteration och tog genomsnittet.

Tid (millisekunder) för 10.000 iterationer (en serialisering och en deserialisering):

SoapFormatter
============
AVG: 1908

BinaryFormatter
=============
AVG: 407

JavaScriptSerializer
================
AVG: 993