【发布时间】:2021-06-06 13:24:04
【问题描述】:
我正在为协议编写文本数据包分析器,在优化它时我发现find_first_not_of 调用是一个很大的瓶颈。
本质上,如果一个数据包只包含有效字符,我需要查找它是否有效,比默认的 C++ 函数更快。
例如,如果所有允许的字符都是f、h、o、t 和 w,在 C++ 中我只会调用 s.find_first_not_of("fhotw"),但在 SSEx 中我不知道后面将字符串加载到一组__m128i 变量中。
显然,_mm_cmpXstrY 函数文档在这方面并没有真正帮助我。 (例如_mm_cmpistri)。一开始我可以用_mm_sub_epi8 减去,但我认为这不是一个好主意。
此外,我坚持使用 SSE(任何版本)。
【问题讨论】:
-
所以你可以使用SSE4.2
pcmpistri?这是它实际上有好处的一件事,并且可能比多次pcmpeqb/por检查更快。没错,英特尔的文档非常不透明。 strchr.com/strcmp_and_strlen_using_sse_4.2 是对功能的更好介绍/概述,例如“等于任何”模式。 -
是的,我可以使用 SSE4.2,所以
pcmpistri在桌面上。 -
参见 Wojciech Muła 的(旧)文章 check which bytes are in a set。
-
@aqrit 完美解决。如果你把它变成一个答案,我会关闭它。
标签: string optimization sse intrinsics sse4