В проекте, над которым я работаю, я должен отправлять массивы float / double назад и вперед по сети, я использую Boost.Asio для сетевых вещей, так как мне нужно, чтобы связь была асинхронной, и это просто казалось лучшим (единственным реальным?) там ...
Отправленные массивы являются числами с плавающей запятой / двойными числами, и тип известен обеим сторонам. AFAIK, возможны проблемы со стандартами хранения с плавающей запятой + те же вещи, что и с long / ints, endian и т. Д.
Логически, отправленные массивы представляют собой плотные матрицы, обрабатываемые Eigen на одном конце, используя BLAS / [MKL | ATLAS] и еще много чего на другом конце, вполне возможно, что понадобятся другие варианты использования, поэтому я собираюсь перейти к самый общий возможный способ, и кажется, что он обходит массивы.
Ключевым требованием является высокая производительность и портативность, так как клиент и сервер могут работать на любой комбинации 32/64 бит, а связь довольно интенсивная (мониторинг в режиме реального времени обновляет каждые несколько секунд для клиент), поэтому издержки сериализации должны быть минимальными.
Из того, что я нашел до сих пор, два крупных игрока, которые следует рассмотреть здесь, это Boost.Serialization и Google Protobuf.
Большим плюсом для BS является то, что я использую Boost довольно часто уже в проекте (хотя юнит-тестирование в Google Test), и, кажется, действительно просто сериализовать массив с помощью make_array()
. Большой плюс к этому - производительность.
Преимущество для protobuf в том, что я обнаружил, заключается в производительности: все стенды, кажется, показывают, что он превосходит BS в 10-20 раз при ЛЮБОЙ работе. Что я не нашел в документации по protobuf, так это добавление массива к сообщению. Он использует повторяющиеся поля, и из того, что я понимаю, я должен был бы использовать MsgObject.repeatedProp.Add(const T&)
для каждого элемента массива, что означало бы, то есть, вызовы 10k для него для массива 10k, и это тоже довольно дорого.
Любые предложения о том, как решить эту проблему, будут высоко оценены, так как мой опыт работы с C ++ ограничен, и я только недавно возобновил запись в нем после длительного перерыва ...