我反复通过UDP套接字发送数据。数据格式。
int32_t bid
int32_t ask
int32_t price
所有字段都是有条件的。所以,我使用3个额外的位来跟踪消息中存在哪些字段。我在发送之前将这些字段写入char数组。
所以我的格式变成了。
[ first 3 bits | 5 bits] [ ? 32 ] [ ? 32 ] [ ? 32 ]
问题是我浪费了5比特。我可以用二进制操作做脏指针airthmetic以保存这些位,但它可能会带走处理速度。我怎样才能在c ++中干净利落地做到这一点?
请为此提供一个简单的代码段。
答案 0 :(得分:2)
如果你非常关心这5位,那么你很可能通过动态减少bid
,ask
和price
字段的字段大小来节省更多。然后在标题字段中,您可以为每个有效负载字段分配两个位,以保存三个可能的值:
答案 1 :(得分:2)
我认为魔鬼在这些事情中处于细节之中。研究您发送的消息的统计信息可能是明智的,因为它可能会设计一个提高平均性能的方案。
例如,如果您一次发送一堆这些(以便关于标题大小的注释可能放错位置),那么您可以将消息块排列为八个数组(每个都有一个计数):包含所有3个字段的消息,然后是带有just,say bid和ask等的消息。这确实会为邮件添加8个计数,但这意味着您不会发送不在其中的字段;您是否平均保存将取决于块的大小和消息的统计信息。如果某些组合很少见,那么在数组之前可以有一个类型字段来指定哪些类型。
要考虑的另一件事是你是否可以从田里偷走一些比特。例如,如果您有比较字段,那么您是否需要其他32位?比方说,问题可以编码为与出价相差30比?
答案 2 :(得分:1)
正如评论中已经讨论过的,第一件事是将多个消息组合成一个UDP数据包。而且它看起来并不那么简单。这里最大的挑战是确定数据包大小。
最大UDP有效负载大小为65,507 bytes(我假设它默认为UDP over IPv4)。如果UDP有效载荷大小大于MTU大小,UDP将silently segment the packet。在现实生活中,UDP包大小通常等于或小于MTU大小。但即使MTU大小(~1500字节)也可能太大。有一些针对多媒体流应用的研究表明,如果网络拥挤,建议使用400字节有效载荷大小,以便在丢弃机会和不浪费UDP /带宽之间取得良好平衡,那么大型UDP数据包通常会被丢弃。 IP标头。同样,这取决于您的应用程序,主要取决于您的数据流量。
然后,您可以应用不同的压缩技术。 bid
可以通过以下方式压缩: Variable Length Encoder或Run Length Encoder取决于bid
的性质。
我不知道ask
字段是什么,但price
看起来像是fixed point number的合适人选。如果ask
与price
相关,则可能需要发送它们之间的差异并保存一些位。
首先,确定您真正需要的每个字段的位数,然后决定如何安排它们以最小化间隙或优化性能。位操作非常昂贵,最小化数据复制也可以优化性能。