Производительность: BinaryFormatter против XmlSerializer - PullRequest
9 голосов
/ 23 августа 2010

Я очень часто читал, что BinaryFormatter имеет лучшую производительность, чем XmlSerializer.Из любопытства я написал тестовое приложение.

Важный момент ... почему Xml намного быстрее, чем Bin (особенно десериализация)?

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

мои результаты:

Bin: 13472.7706
Bin-D: 121131.9284
Xml: 8917.51
Xml-D: 12841.7345

Ответы [ 3 ]

7 голосов
/ 23 августа 2010

Поскольку вы сериализуете объект, у которого нет каких-либо свойств.

Если вы сериализуете что-то другое, которое на самом деле содержит некоторые данные, например строку, двоичный сериализатор работает намного быстрее, чем XMLserialiser.

Я сделал это изменение в вашем коде:

items.Add("asfd");

, и я получил такой результат:

Xml: 1219.0541
Bin: 165.0002

Конечно, часть различий заключается в том, чтоФайл XML примерно в десять раз больше двоичного файла.

3 голосов
/ 23 августа 2010

Пример довольно хороший, и вопрос интересный (я согласен с Робертом в том, что вам следует хотя бы раз запустить сам метод Main, прежде чем выполнять какие-либо измерения, так как инициализация сортов не должна рассматриваться как часть теста.)

При этом одно из ключевых отличий между XmlSerializer и BinaryFormatter (помимо очевидного) заключается в том, что XmlSerializer не пытается отслеживать ссылки. Если у вашего графа объектов есть несколько ссылок на один и тот же объект, вы получаете несколько копий в XML, и это не разрешается должным образом (обратно в один объект) после десериализации. Хуже того, если у вас есть циклы, объект вообще не может быть сериализован. Сравните это с BinaryFormatter, который отслеживает ссылки и надежно восстанавливает граф объектов независимо от того, сколько и какого типа ссылок на объекты вы можете иметь. Возможно, накладные расходы этого средства объясняют худшую производительность?

Основной причиной использования BinaryFormatter поверх XmlSerializer является размер вывода, а не производительность сериализации / десериализации. (Затраты на создание текста не так велики, это дорогостоящая транспортировка этого XML-текста.)

1 голос
/ 11 мая 2011
...