Boost.Asio с буферами протокола Google - PullRequest
15 голосов
/ 08 ноября 2011

В настоящее время я изучаю способы улучшения нашего существующего механизма ручной сериализации сети c ++, поддерживая существующий двоичный протокол.Первым подходом было его кодирование с использованием Boost.Asio с Boost.Serialisation с использованием двоичной сериализации.Как бы то ни было, оказалось, что это немного медленнее (на 10%), чем наша текущая ручная реализация.Кто-нибудь имеет реальный опыт _real_work_ по использованию Google Probubu вместе с Boost.Asio?

Я искал в Google образцы, но смог найти только этот пример:

Увеличить Asio с помощью образца буферов протокола Google

Кто-нибудьсделал это в любом реальном проекте?Мне очень интересны показатели производительности, так как это должно быть довольно быстро ...

1 Ответ

22 голосов
/ 08 ноября 2011

Мы используем boost :: asio и Protobuf для сложных протоколов с низкой скоростью передачи сообщений.Для простых протоколов с высокой скоростью передачи сообщений мы используем boost :: asio и настраиваемую сериализацию.

Библиотека C ++ Protobuf использует std :: string для представления строковых полей для сообщений, которые она десериализует, что означает, что Protobuf выполняет бесплатное распределение хранилища для каждого строкового поля в каждом полученном сообщении.Это делает Protobuf не очень эффективным для действительно высокочастотного обмена сообщениями.Это замечательный инструмент для создания богатых, сложных, платформо-независимых, совместимых с прямой и обратной связью протоколов.

ADDENDUM

Так как кажетсякак люди читают этот ответ, я должен поделиться, что я узнал, что в C ++ Protobuf вы можете повторно использовать объекты сообщений десериализации, чтобы уменьшить частоту malloc при чтении.

См. Советы по оптимизации:

https://developers.google.com/protocol-buffers/docs/cpptutorial

...