Буфери протоколів проти JSON або BSON [закрито]


90

Хто-небудь має інформацію про робочі характеристики буферів протоколів проти BSON (двійковий JSON) або взагалі JSON?

  • Розмір дроту
  • Швидкість серіалізації
  • Швидкість десериалізації

Вони здаються хорошими двійковими протоколами для використання через HTTP. Мені просто цікаво, що було б краще в довгостроковій перспективі для середовища C #.

Ось інформація, яку я читав про BSON та буфери протоколів .


Деякі стверджують (я думаю, що сюди входить колишній автор protobuf), що краще використовувати більший, але дешевший для серіалізації формат, а потім стискати результат за допомогою швидкого стандартного компресора.
CodesInChaos


Я не думаю, що це слід відкривати, доки в самому питанні не буде запропоновано певний метод порівняння (інакше це для досить самовпевненої дискусії / занадто широкої)
YakovL

Відповіді:


64

Ощадливість - це ще одна альтернатива, схожа на буфери протоколів.

У спільноті Java є хороші орієнтири щодо серіалізації / десеріалізації та розміру проводів цих технологій: https://github.com/eishay/jvm-serializers/wiki

Загалом, JSON має трохи більший розмір дроту і дещо гірший DeSer, але перемагає повсюдно і здатністю легко інтерпретувати його без вихідного IDL. Останній момент - це те, що Apache Avro намагається вирішити, і це перевершує як продуктивність.

Microsoft випустила пакет C # NuGet Microsoft.Hadoop.Avro .


1
Невеликий розмір повідомлення не перекладається автоматично у швидку перфоранцію, див. Цю статтю soa.sys-con.com/node/250512
vtd-xml-author 03.03.10

1
Гарне посилання; єдине, у чому я не впевнений, це коментар щодо Avro - хоча він може працювати ефективніше для основних випадків використання (тонни подібних записів даних), схоже, він не працює дуже швидко в цьому еталоні (який перевіряє обробку один запит)
StaxMan

CoDec, MoDem .... Мені більше подобаються "SeDes" :)
nawfal


52

Ось кілька останніх тестів, що показують ефективність популярних .NET-серіалізаторів.

У тестах Горіння Монахов показують продуктивність сериализации простий ПОКИ в той час як комплексні Northwind тести показують , об'єднані результати сериализации рядки в кожній таблиці Борого набору даних Microsoft.

введіть тут опис зображення

В основному буфери протоколів ( protobuf-net ) приблизно в 7 разів швидші, ніж найшвидший серіалізатор бібліотеки базового класу в .NET (XML DataContractSerializer). Він також менший за конкуренцію, оскільки він також у 2,2 рази менший, ніж Microsofts, найкомпактніший формат серіалізації (JsonDataContractSerializer).

Текстові серіалізатори ServiceStack найближчі до відповідності продуктивності двійкового протобуфа-мережі, де його серіалізатор Json лише в 2,58 рази повільніший за протобуф-мережу.


1
Чудовий пост - але, якщо це можливо, ви завжди повинні поміщати стовпчики помилок на свої гістограми при відображенні середніх значень.
jtromans

Чому JIL не включається в тести? (Ви уявляєте, чому?)
Рої Намір,

22

Буфери протоколу призначені для дроту:

  1. дуже малий розмір повідомлення - один аспект є дуже ефективним цілочисельним представленням змінних розмірів.
  2. Дуже швидке декодування - це двійковий протокол.
  3. protobuf генерує надзвичайно ефективний C ++ для кодування та декодування повідомлень - підказка: якщо ви кодуєте в нього всі цілі числа чи статичні розміри, він буде кодувати та декодувати з детермінованою швидкістю.
  4. Він пропонує ДУЖЕ багату модель даних - ефективно кодує дуже складні структури даних.

JSON - це просто текст, і його потрібно проаналізувати . підказка: кодування в нього "мільярда" int займе досить багато символів: Billion = 12 символів (довга шкала), у двійковому файлі це поміщається в uint32_t. А як щодо спроби кодування подвійного? це було б ДАЛЬКО ДАЛЬШЕ гірше.


4
Однак у нього є досить прикрий мінус - не обробляти спадщину, і хоча композиція є допустимою альтернативою, я вважаю за краще, щоб мій об'єкт передачі даних не змушував використовувати композицію, а не успадкування.
Mark Green

4
Я вважаю, що розширення можна використовувати дуже схоже на успадкування ... developers.google.com/protocol-buffers/docs/reference/…
kralyk

1
Так, розширення - це дуже хороший момент. Я використовую його на практиці на роботі щодня.
Yngve Sneen Lindal

"буфери протоколів призначені для дроту" Що таке "дроти"?
Маркос Перейра

@marcospgp the wireозначає просто мережу. Зараз, коли ми використовуємо стільки бездротових мереж, це може здатися дивним.
Віктор Ярема
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.