Буферы протокола против 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.
Ответ 2
Это сообщение сравнивает скорости и размеры сериализации в .NET, включая JSON, BSON и XML.
alt text http://james.newtonking.com/images/eb2.NETSerializationPerformanceCompariso_DB29/json356otherperformance.png
alt text http://james.newtonking.com/images/eb2.NETSerializationPerformanceCompariso_DB29/json356size.png
http://james.newtonking.com/archive/2010/01/01/net-serialization-performance-comparison.aspx
Ответ 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 хуже.