Буферы протокола по сравнению с JSON или BSON [закрыто]

90

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

  • Размер провода
  • Скорость сериализации
  • Скорость десериализации

Они кажутся хорошими двоичными протоколами для использования через HTTP. Мне просто интересно, что было бы лучше в долгосрочной перспективе для среды C #.

Вот некоторая информация, которую я читал о BSON и буферах протокола .

Джефф Фрикаделька Ян
источник
Некоторые утверждают (я думаю, это включает в себя бывшего автора protobuf), что лучше использовать более крупный, но более дешевый формат для сериализации и последующего сжатия вывода с помощью быстрого стандартного компрессора.
CodesInChaos
Я не думаю, что это следует открывать снова, пока в самом вопросе не будет предложен определенный метод сравнения (в противном случае это для довольно самоуверенного обсуждения / слишком широкого)
YakovL

Ответы:

65

Экономия - это еще одна альтернатива, подобная протоколу.

Сообщество 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
1
Хорошая ссылка; единственное, в чем я не уверен, это комментарий об Avro - хотя он мог бы работать более эффективно для своих основных случаев использования (тонны похожих записей данных), он, похоже, не работает очень быстро в этом тесте (который проверяет обработку единый запрос)
StaxMan 05
CoDec, MoDem .... Мне больше нравится "SeDes" :)
nawfal
52

Вот несколько недавних тестов, показывающих производительность популярных сериализаторов .NET.

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

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

Обычно буферы протокола ( protobuf-net ) примерно в 7 раз быстрее, чем самый быстрый сериализатор библиотеки базовых классов в .NET (XML DataContractSerializer). Он также меньше, чем у конкурентов, поскольку он также в 2,2 раза меньше, чем самый компактный формат сериализации Microsoft (JsonDataContractSerializer).

Сериализаторы текста ServiceStack наиболее близки к производительности двоичного protobuf-net, где его сериализатор Json всего в 2,58 раза медленнее, чем protobuf-net.

миф
источник
1
Отличный пост, но, если возможно, вы всегда должны помещать полосы ошибок на свои гистограммы при отображении средних значений.
jtromans
Почему JIL не включен в тесты? (ты хоть представляешь почему?)
Рой Намир
23

буферы протокола предназначены для проводов:

  1. очень маленький размер сообщения - одним из аспектов является очень эффективное целочисленное представление переменного размера.
  2. Очень быстрое декодирование - это бинарный протокол.
  3. protobuf генерирует сверхэффективный C ++ для кодирования и декодирования сообщений - подсказка: если вы закодируете в него все целые числа var или элементы статического размера, он будет кодировать и декодировать с детерминированной скоростью.
  4. Он предлагает ОЧЕНЬ богатую модель данных - эффективно кодирует очень сложные структуры данных.

JSON - это просто текст, и его нужно проанализировать . Подсказка: для кодирования "миллиарда" int в него потребуется довольно много символов: Billion = 12 char (длинная шкала), в двоичном формате он умещается в uint32_t. А как насчет попытки кодирования double? это было бы НАМНОГО хуже.

Хасан Сайед
источник
4
Однако у него есть довольно досадный недостаток, заключающийся в том, что он не обрабатывает наследование, и, хотя композиция является допустимой альтернативой, я предпочитаю, чтобы мой объект передачи данных не заставлял использовать композицию, а не наследование.
Марк Грин
4
Я считаю, что расширения можно использовать очень похоже на наследование ... developers.google.com/protocol-buffers/docs/reference/…
kralyk 01
1
Да, расширения - это очень хороший момент. Использую на работе каждый день.
Yngve Sneen Lindal
«Буферы протокола предназначены для провода» Что такое «провод»?
Маркос Перейра
@marcospgp the wireозначает просто сеть. Сейчас, когда мы используем так много беспроводных сетей, это может показаться странным.
Виктор Ярема