Antonio Esposito's


Prodotti tipici .NETtiani

Benchmark Serializzazioni

Ieri sera ho passato un po di tempo a fare un banchmark della velocità di serializzazione / deserializzazione dei vari componenti standard del .NET poichè impatta nello scambio dati tra servizi e nella gestione della sessione su SQL Server. Ne posto i risultati. Il test l'ho fatto sulla mia macchinetta di sviluppo in ufficio...

istanza:
[Serializable][DataContract]
public class item {
  [DataMember]
  public int ID {get; set; }
  [DataMember]
  public string LongString {get; set; }
  [DataMember]
  public byte[] LongByteArray {get; set; }
  [DataMember]
  public DataTable Table {get; set; }
}

Questa istanza viene popolata all'inizio del benchmark così:
ID= intero random
LongByteArray = array di 1MB di byte random
LongString = Convert.ToBase64String(LongByteArray)
Table = un datatable deserializzato con DataSet.ReadXml() di 12 colonne per 300 righe circa

Per ogni tipo di serializzatore ho fatto 10 iterazioni di serializzazione / deserializzazione e conteggiato il tempo con uno Stopwatch, poi ho salvato chiave e tempi in un dizionario ciascuno per dimensione del risultato in byte, millisecondi di serializzazione e deserializzazione. Alla fine ho fatto la media con LINQ e le percentuali in excel:

Risultati:
Formatter                bytes (%)              ms. serializzazione (%)   ms. deserializzazione(%)
BinaryFormatter       2.776.736 (100%)  55 (100%)                      30 (100%)
SoapFormatter         3.119.771 (116%)  168 (116%)                     147 (490%)
XMLSerializer           3.135.384 (113%)  42 (76%)                        73 (234%)
DataContractS.        3.073.568  (111%)  43 (78%)                       56 (187%)
DataContractJsonS.  5.448.210 (197%)  356 (647%)                    1822 (6073%)

Considerazioni:
A questo punto non posso non confermare il BinaryFormatter come il più conciso e veloce serializzatore in generale... anche se non sempre tutte le classi sono [Serializable]......
Per prestazioni è da considerare buono anche l'XMLSerializer o il DataContract, ma solo per la parte di serializzazione, facendo pensare che durante l'uso di un WS o di un WCF, chi sostiene il maggior costo della procedura serializzazione/deserializzazione è il client del servizio, e non il server in se.

Ciao

Categoria: Tips
martedì, 12 gen 2010 Ore. 12.13
Statistiche
  • Views Home Page: 11.398
  • Views Posts: 60.033
  • Views Gallerie: 0
  • n° Posts: 44
  • n° Commenti: 16
Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003