减少要通过UDP套接字发送的数据

时间:2016-10-24 07:52:29

标签: c++ algorithm c++11 pointers udp

我反复通过UDP套接字发送数据。数据格式。

int32_t bid
int32_t ask
int32_t price

所有字段都是有条件的。所以,我使用3个额外的位来跟踪消息中存在哪些字段。我在发送之前将这些字段写入char数组。

所以我的格式变成了。

[ first 3 bits | 5 bits] [ ? 32 ] [ ? 32 ] [ ? 32 ]

问题是我浪费了5比特。我可以用二进制操作做脏指针airthmetic以保存这些位,但它可能会带走处理速度。我怎样才能在c ++中干净利落地做到这一点?

请为此提供一个简单的代码段。

3 个答案:

答案 0 :(得分:2)

如果你非常关心这5位,那么你很可能通过动态减少bidaskprice字段的字段大小来节省更多。然后在标题字段中,您可以为每个有效负载字段分配两个位,以保存三个可能的值:

  • 0 - 该字段不存在
  • 1 - 该字段存在并以16位编码
  • 2 - 该字段存在且以32位编码

答案 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 EncoderRun Length Encoder取决于bid的性质。

我不知道ask字段是什么,但price看起来像是fixed point number的合适人选。如果askprice相关,则可能需要发送它们之间的差异并保存一些位。

首先,确定您真正需要的每个字段的位数,然后决定如何安排它们以最小化间隙或优化性能。位操作非常昂贵,最小化数据复制也可以优化性能。