protobuf-сеть НЕ быстрее, чем двоичная сериализация?

Я записал программу для сериализации класса 'Человека' с помощью XMLSerializer, BinaryFormatter и ProtoBuf. Я думал, что protobuf-сеть должна быть быстрее, чем другие два. Сериализация Protobuf была быстрее, чем XMLSerialization, но намного медленнее, чем двоичная сериализация. Действительно ли мое понимание является неправильным? Заставьте меня понять это. Спасибо за справку.

ОТРЕДАКТИРУЙТЕ:-, я изменил код (обновленный ниже), чтобы измерить время только для сериализации и не создания потоков и все еще видеть различие. Можно было сказать мне почему?

Следующее является выводом:-

Человек был создан с помощью буфера протокола в 347 миллисекундах

Человек получил созданное использование XML в 1462 миллисекунды

Человек был создан с помощью двоичного файла в 2 миллисекундах

Код ниже

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ProtoBuf;
using System.IO;
using System.Diagnostics;
using System.Runtime.Serialization.Formatters.Binary;
namespace ProtocolBuffers
{
    class Program
    {
        static void Main(string[] args)
        {

            string folderPath  = @"E:\Ashish\Research\VS Solutions\ProtocolBuffers\ProtocolBuffer1\bin\Debug";
            string XMLSerializedFileName = Path.Combine(folderPath,"PersonXMLSerialized.xml");
            string ProtocolBufferFileName = Path.Combine(folderPath,"PersonProtocalBuffer.bin");
            string BinarySerializedFileName = Path.Combine(folderPath,"PersonBinary.bin");

            if (File.Exists(XMLSerializedFileName))
            {
                File.Delete(XMLSerializedFileName);
                Console.WriteLine(XMLSerializedFileName + " deleted");
            }
            if (File.Exists(ProtocolBufferFileName))
            {
                File.Delete(ProtocolBufferFileName);
                Console.WriteLine(ProtocolBufferFileName + " deleted");
            }
            if (File.Exists(BinarySerializedFileName))
            {
                File.Delete(BinarySerializedFileName);
                Console.WriteLine(BinarySerializedFileName + " deleted");
            }

            var person = new Person
            {
                Id = 12345,
                Name = "Fred",
                Address = new Address
                {
                    Line1 = "Flat 1",
                    Line2 = "The Meadows"
                }
            };

            Stopwatch watch = Stopwatch.StartNew();

            using (var file = File.Create(ProtocolBufferFileName))
            {
                watch.Start();
                Serializer.Serialize(file, person);
                watch.Stop();
            }

            //Console.WriteLine(watch.ElapsedMilliseconds.ToString());
            Console.WriteLine("Person got created using protocol buffer in " + watch.ElapsedMilliseconds.ToString() + " milliseconds ");

            watch.Reset();

            System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(person.GetType());
            using (TextWriter w = new StreamWriter(XMLSerializedFileName))
            {
                watch.Start();
                x.Serialize(w, person);
                watch.Stop();
            }

            //Console.WriteLine(watch.ElapsedMilliseconds.ToString());
            Console.WriteLine("Person got created using XML in " + watch.ElapsedMilliseconds.ToString() + " milliseconds");

            watch.Reset();

            using (Stream stream = File.Open(BinarySerializedFileName, FileMode.Create))
            {
                BinaryFormatter bformatter = new BinaryFormatter();
                //Console.WriteLine("Writing Employee Information");
                watch.Start();
                bformatter.Serialize(stream, person);
                watch.Stop();
            }

            //Console.WriteLine(watch.ElapsedMilliseconds.ToString());
            Console.WriteLine("Person got created using binary in " + watch.ElapsedMilliseconds.ToString() + " milliseconds");

            Console.ReadLine();



        }
    }


    [ProtoContract]
    [Serializable]
    public class Person
    {
        [ProtoMember(1)]
        public int Id { get; set; }
        [ProtoMember(2)]
        public string Name { get; set; }
        [ProtoMember(3)]
        public Address Address { get; set; }
    }
    [ProtoContract]
    [Serializable]
    public class Address
    {
        [ProtoMember(1)]
        public string Line1 { get; set; }
        [ProtoMember(2)]
        public string Line2 { get; set; }
    }
}
8
задан djdd87 3 June 2010 в 14:49
поделиться

1 ответ

Я ответил на вашу электронную почту; Я не знал, что вы тоже разместили это здесь. Первый вопрос: какая версия protobuf-net? Причина, по которой я спрашиваю, заключается в том, что в магистрали разработки «v2» намеренно отключена автокомпиляция, чтобы я мог использовать свои модульные тесты для тестирования как исполняемой, так и предварительно скомпилированной версии. Поэтому, если вы используете «v2» (доступно только в исходном коде), вам нужно указать ему, чтобы он скомпилировал модель - в противном случае он выполняет 100% -ное отражение.

В «v1» или «v2» вы можете сделать это с помощью:

Serializer.PrepareSerializer<Person>();

После этого я получаю числа (из кода в вашем электронном письме; я не проверял, совпадает ли указанное выше sample):

10
Person got created using protocol buffer in 10 milliseconds
197
Person got created using XML in 197 milliseconds
3
Person got created using binary in 3 milliseconds

Другой фактор - это повторы; 3-10 мс - это откровенно пустяки; вы не можете сравнивать числа на этом уровне.Используя его для повторения 5000 раз (повторное использование экземпляров XmlSerializer / BinaryFormatter ; никаких ложных затрат), я получаю:

110
Person got created using protocol buffer in 110 milliseconds
329
Person got created using XML in 329 milliseconds
133
Person got created using binary in 133 milliseconds

Доводя это до глупых крайностей (100000):

1544
Person got created using protocol buffer in 1544 milliseconds
3009
Person got created using XML in 3009 milliseconds
3087
Person got created using binary in 3087 milliseconds

Итак, в конечном итоге:

  • когда у вас практически нет данных для сериализации, большинство подходов будут очень быстрыми (включая protobuf-net)
  • , когда вы добавляете данные, различия становятся более очевидными; protobuf здесь обычно лучше всего, либо для отдельных больших графов, либо для множества маленьких графов

Обратите внимание, что в "v2" скомпилированная модель может быть полностью статически скомпилирована (в dll, которую вы можете развернуть), удаляя даже (уже небольшие) расходы на раскрутку.

25
ответ дан 5 December 2019 в 05:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: