在我从事的一个项目中,我必须通过网络来回发送浮点/双精度数组,我使用 Boost.Asio 来处理网络内容,因为我需要异步通信,而这似乎是那里最好的(唯一真实的?)...
发送的数组是浮点数/双精度数,双方都知道类型。AFAIK,浮点存储标准可能存在问题+与 longs/ints、endians 等相同的东西。
从逻辑上讲,发送的数组是密集矩阵,一端由 Eigen 处理,另一端使用 BLAS / [MKL|ATLAS] 和诸如此类的东西,很可能需要其他用途,所以我将采用最通用的方式可能&这似乎是在传递数组。
关键要求是高性能和可移植性,因为客户端和服务器都可以在 32 / 64 位的任意组合上运行,并且通信非常密集(实时监控,客户端每秒刷新一次),所以序列化开销本身必须是最小的。
从我目前发现的情况来看,这里要考虑的两个大玩家是 Boost.Serialization 和 Google 的 Protobuf。
BS 的最大优点是我已经在项目中大量使用了 Boost(尽管单元测试在 Google 测试中),而且使用make_array()
. 它的最大缺点是性能。
从我的发现来看,protobuf 的优势在于性能,所有的测试似乎都表明它在任何操作上都比 BS 高出 10-20 倍。我在 protobuf 文档中没有找到的是在消息中添加一个数组。它使用重复的字段,据我了解,我必须MsgObject.repeatedProp.Add(const T&)
在数组的每个元素上使用,这意味着,对于 10k 数组,它需要 10k 次调用,这似乎也有点昂贵。
任何关于如何解决这个问题的建议都将受到高度赞赏,因为我对 C++ 的经验是有限的,而且我最近才在长时间休息后重新开始编写它......