Performance XML Serializer vs StringBuilder

Tags: C#, XMLSerializer, StringBuilder, Visual Studio Performance Analysis

Leggendo l'interessante post di Emiliano

mi sono messo a giocare un pò con XmlSerializer, StringBuilder e Performance Analysis di Visual studio 2012.

Ovviamente XmlSerializer agevola notevolmente la serializzazione di una struttura anche complessa di oggetti, ma non è detto che sia il metodo più efficiente...

Ho creato due metodi (a corredo il codice sorgente) per serializzare la stessa classe:

  • Serialize1() - tramite XmlSerializer
  • Serialize2() - "concatenazione di stringhe" tramite StrinBuilder

Ecco un grafico del tempo impiegato per l'esecuzione dei due metodi:

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Text;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Order order = GetOrder();
            string s1 = Serialize1(order);

            string s2 = Serialize2(order);

            string s22 = Serialize2(order);

            string s11 = Serialize1(order);
        }

        static string Serialize1(Order o)
        {
            var serializer = new XmlSerializer(typeof(Order));
            var sb = new StringBuilder();
            TextWriter txtWriter = new StringWriter(sb);
            serializer.Serialize(txtWriter, o);
            return txtWriter.ToString();
        }

        static string Serialize2(Order o)
        {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.AppendLine("");
            stringBuilder.AppendLine(
                "");
            stringBuilder.AppendLine(string.Format("{0}", o.Code));
            stringBuilder.AppendLine(string.Format("{0}", o.DateTime.ToString(CultureInfo.InvariantCulture)));
            stringBuilder.AppendLine("");

            foreach (Item item in o.Items)
            {
                stringBuilder.AppendLine("");
                stringBuilder.AppendLine(string.Format(" {0}", item.Code));
                stringBuilder.AppendLine(string.Format("{0}", item.Description));
                stringBuilder.AppendLine(string.Format("{0}", item.Price));
                stringBuilder.AppendLine(string.Format("{0}", item.Qantity));
                stringBuilder.AppendLine("");
            }

            stringBuilder.AppendLine("");
            stringBuilder.AppendLine("");
            return stringBuilder.ToString();
        }

        static Order GetOrder()
        {
            Order order = new Order
            {
                Code = "Code",
                DateTime = DateTime.Now,
                Items = new List(),
                Totals = 99
            };
            for (int i = 0; i < 1000000; i++)
            {
                order.Items.Add(new Item
                {
                    Code = string.Format("Code{0}", i),
                    Description = string.Format("Description{0}", i),
                    Price = i,
                    Qantity = 1
                });
            }
            return order;
        }

    }

    public class Order
    {
        public string Code { get; set; }
        public DateTime DateTime { get; set; }
        public List Items { get; set; }
        public Decimal Totals { get; set; }
    }

    public class Item
    {
        public string Code { get; set; }
        public string Description { get; set; }
        public decimal Price { get; set; }
        public int Qantity { get; set; }
    }

}
Add a Comment