Буферы протокола против JSON или BSON

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

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

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

Вот некоторая информация, которую я читал на BSON и Protocol Буферы.

Ответ 1

Thrift - еще одна альтернатива протокола Buffer.

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

В общем, JSON имеет немного больший размер проводов и немного хуже DeSer, но выигрывает от повсеместности и способности легко интерпретировать его без IDL источника. Последний момент - это то, что Apache Avro пытается решить, и это бьется как с точки зрения производительности.

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

Ответ 3

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

Тесты Burning Monks показывают производительность сериализации простого POCO, в то время как комплексные тесты Northwind показывают объединенные результаты сериализации строки в каждой таблице набора данных Microsoft Northwind.

enter image description here

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

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

Ответ 4

Буферы протокола

предназначены для проводов:

  • очень маленький размер сообщения - один аспект - очень эффективное целочисленное представление переменной размера.
  • Очень быстрое декодирование - это двоичный протокол.
  • protobuf генерирует суперэффективный С++ для кодирования и декодирования сообщений - подсказка: если вы кодируете все переменные-переменные или элементы статического размера, он будет кодировать и декодировать с детерминированной скоростью.
  • Он предлагает очень богатую модель данных - эффективно кодирует очень сложные структуры данных.

JSON - это просто текст, и он должен быть проанализирован. hint: кодирование "миллиарда" int в него потребует довольно много символов: Billion = 12 char (long scale), в двоичном формате он вписывается в uint32_t. А как насчет того, чтобы пытаться закодировать double? это будет FAR FAR хуже.