Boost.Asio с буферами протокола google

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

Я искал google для образцов, но мог только придумать этот пример:

Boost Asio с образцом буферов протокола Google

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

Ответы

Ответ 1

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

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

Я бы использовал Protobuf всюду, если бы мог. Это замечательный инструмент для создания богатых, сложных, независимых от платформы, совместимых с протоколом "вперед-назад".

ДОПОЛНЕНИЕ

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

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

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