尽快在网络流中搜索块

Search block in network stream as quick as possible

本文关键字:搜索 网络      更新时间:2023-10-16

我想询问网络流中搜索模式的方法。

我当前的方法是在数据大小超过阈值时分配一个大缓存,将数据从套接字放在缓存中,然后开始在缓存中搜索所有同步标头(使用KMP算法)。它有效,但看起来有些麻烦。

标题非常简单的标志,例如" 0xffeebbaa1290"。

是否有一个技巧可以在没有积累的情况下尽快检查标头?那是在接收数据时,请检查是否及时到达完整的数据块。

数据正在连续到达,没有任何间隔来指示不同的数据blcok。

我使用圆形缓冲区检查了第一个标头和下一个标头以决定整个块,但是许多Modulo(用于圆形缓冲区索引)操作会大大降低速度。我只是使用MEMCMP查找标头。

fyi,我喜欢语言是c/c 。

希望得到您的建议。任何参考链接也欢迎。

谢谢。


请允许我添加有关此问题的一些详细信息。

数据来自我无法控制的董事会。该设备从他的来源发送来自Arivray位置的数据,并且不遵循任何规则,例如建立连接何时必须以包裹在正面的标头开始。更糟糕的是,块长度不是固定的,我必须检查2个标头。

在我的方法中,我尝试在开始时找到第一个标题,如果不相遇,我会将每个字节放下直到标题来了。这样,至少我可以gurantee第一个标头处于缓存的开头(高速缓存大小比KMP方法小得多,因为我不希望延迟搜索标头),然后继续接收数据并同时检查下一个标头。

如果找到块,则块数据将移至其他过程,然后第二个标头将移至缓存的前面。它导致缓存应重新对准以接受下一个数据,这就是为什么我使用循环缓冲区(存储数据到数组)实现的原因。即,只需设置读写位置,实际上没有移动保留在缓存中的数据。

列表或向量被尝试但由于字节块操作和性能考虑而未使用。

问题是我必须在数据到达时不断检查下一个标题

是否有一种优雅的方式避免这种频繁的字节扫描?

或如果速度合理,我也可以接受频繁的字节扫描,但是用于计算循环缓冲区读取和写作位置的模型操作似乎放慢了性能。我使用了不同的分析工具,所有这些都表明频繁的模型是性能瓶颈。

"在实时实时尽快"已经是一个矛盾。实时意味着与数据到达一样快;无需更快。实际上,实时通常比批处理处理要慢。

实时还需要在可用的时间和时间上进行艰难的数字,在此处都不可用。

您的标头显示为1个缓存线。不太需要KMP或类似算法。与0xFF, 0xEE, 0xBB, 0xAA, 0x12 or 0x90检查单个字节相比,检查0xFF中的所有字节几乎可以肯定要快。

现在,"众多Modulo(用于圆形缓冲区索引)操作极大地降低了速度"是一个现实的问题。但这确实具有直接的解决方案。确保缓冲区的大小为编译时间常数,并且两个的功率。x%(1<<N)等于x & ((1<<N)-1)