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

C++ 减少通过UDP套接字发送的数据,c++,algorithm,c++11,pointers,udp,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比特。我可以用二进制操作来做脏指针算法来保存这些位,但这可能会降低处理速度。如何在C++中实现简洁高效的< < /P>

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

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

所以我的格式变成了

[ first 3 bits | 5 bits] [ ? 32 ] [ ? 32 ] [ ? 32 ]
问题是我浪费了5比特。我可以用二进制操作来做脏指针算法来保存这些位,但这可能会降低处理速度。如何在C++中实现简洁高效的< < /P>
请为此提供一个简单的代码片段。

如果您非常关心这5位,那么您很可能可以通过动态减少“出价”、“询问”和“价格”字段的大小来节省更多。然后在报头字段中,您可以为每个有效负载字段分配两位,用于保存三个可能的值:

0-该字段不存在 1-字段存在并以16位编码 2-字段存在并以32位编码
如果您非常关心这5位,那么您很可能可以通过动态减少bid、ask和price字段的大小来节省更多。然后在报头字段中,您可以为每个有效负载字段分配两位,用于保存三个可能的值:

0-该字段不存在 1-字段存在并以16位编码 2-字段存在并以32位编码
我认为这些事情的细节才是关键。研究您发送的消息的统计信息可能是明智的,因为可以设计一种方案来提高平均性能

例如,如果您一次发送一组这样的消息,那么有关消息头大小的注释可能会放错位置,那么您可以将消息块安排为八个数组,每个数组都有一个计数:首先是包含所有3个字段的消息,然后是包含just、say bid和ask等字段的消息。这确实会给消息增加8个计数,但意味着您不会发送不存在的字段;是否平均保存取决于块的大小和消息的统计信息。如果某些组合很少出现,则可以在数组前面有一个类型字段,指定存在哪些类型


还有一件事要考虑的是你能否从田里偷一些东西。例如,如果您有出价字段,那么其他字段是否需要完整的32位?比如说,ask可以被编码为与bid的30位差异吗?

我认为这些东西的细节是魔鬼。研究您发送的消息的统计信息可能是明智的,因为可以设计一种方案来提高平均性能

例如,如果您一次发送一组这样的消息,那么有关消息头大小的注释可能会放错位置,那么您可以将消息块安排为八个数组,每个数组都有一个计数:首先是包含所有3个字段的消息,然后是包含just、say bid和ask等字段的消息。这确实会给消息增加8个计数,但意味着您不会发送不存在的字段;是否平均保存取决于块的大小和消息的统计信息。如果某些组合很少出现,则可以在数组前面有一个类型字段,指定存在哪些类型


还有一件事要考虑的是你能否从田里偷一些东西。例如,如果您有出价字段,那么其他字段是否需要完整的32位?比如说,ask可以被编码为与bid的30位差异吗?

正如在评论中所讨论的,第一件事是将多条消息合并到一个UDP数据包中。它并不像看上去那么简单。这里最大的挑战是确定数据包的大小

最大UDP有效负载大小是,我假设默认情况下是IPv4上的UDP。如果UDP有效负载大小大于MTU大小,UDP将。在现实生活中,UDP数据包大小通常等于或小于MTU大小。但即使MTU大小约1500字节也可能太大。有一些关于多媒体流应用程序的研究表明,如果网络拥塞,大的UDP数据包更容易被丢弃,建议使用400字节的有效负载大小作为丢弃机会和不浪费UDP/IP报头带宽之间的良好平衡。同样,这取决于您的应用程序,主要取决于您的数据流量

然后,您可以应用不同的压缩技术。根据您的出价性质,出价可以压缩,例如,或

我不知道ask字段是什么,但price看起来是一个很好的候选字段。如果ask与价格相关,那么发送它们之间的差异并节省一些位可能是值得的

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

如co中所述 首先,将多条消息合并到一个UDP数据包中。它并不像看上去那么简单。这里最大的挑战是确定数据包的大小

最大UDP有效负载大小是,我假设默认情况下是IPv4上的UDP。如果UDP有效负载大小大于MTU大小,UDP将。在现实生活中,UDP数据包大小通常等于或小于MTU大小。但即使MTU大小约1500字节也可能太大。有一些关于多媒体流应用程序的研究表明,如果网络拥塞,大的UDP数据包更容易被丢弃,建议使用400字节的有效负载大小作为丢弃机会和不浪费UDP/IP报头带宽之间的良好平衡。同样,这取决于您的应用程序,主要取决于您的数据流量

然后,您可以应用不同的压缩技术。根据您的出价性质,出价可以压缩,例如,或

我不知道ask字段是什么,但price看起来是一个很好的候选字段。如果ask与价格相关,那么发送它们之间的差异并节省一些位可能是值得的


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

这真的是一个浪费问题吗?UDP数据包增加了您无法避免的更多开销。顺便说一句,int32_t比int更好。如果您想要处理速度,那么您可能也应该对大小字段使用32位整数。@deviantfan UDP标头中的64位。5比特浪费。约8%的废物。我称之为重大浪费要扩展@deviantfan的第一条注释,长度为8字节。然后是至少20个字节的。这一点更为重要。这真的是一个问题吗?UDP数据包增加了您无法避免的更多开销。顺便说一句,int32_t比int更好。如果您想要处理速度,那么您可能也应该对大小字段使用32位整数。@deviantfan UDP标头中的64位。5比特浪费。约8%的废物。我称之为重大浪费要扩展@deviantfan的第一条注释,长度为8字节。然后是至少20个字节的。而这一点更是雪上加霜。