免责声明
- 我已阅读什么是最快的子串搜索算法?,但对单个字符情况可能不够优化。
strchr
要求以空字符结尾的字符串
我正在寻找在字节缓冲区中识别给定字节的第一个出现的最快方法。
这种情况类似于在字符串中查找字符的第一次出现,不同之处在于:
- 字节缓冲区没有以空字符结尾,而是有一个明确的长度(可能包含嵌入的空字符)
- 字节缓冲区没有分配在
string
或vector
中,我只有一个指向其起始位置和长度的指针和切片。
基本解决方案如下:
size_t search(char const* buffer, size_t length, char c) {
return std::find(buffer, buffer + length, c) - buffer;
}
然而,使用Godbolt编译器(
-O2 -msse2 -mavx
)进行快速往返并没有显示任何矢量化指令的迹象,只有一些展开,因此我想知道是否这是最优解。
有没有更快的方法在缓冲区中查找给定字节的第一个出现?
注意:只有第一次出现才重要。
注意:我只关心Linux上的现代x86_64 CPU,但我鼓励答案尽可能通用并清楚地提到假设。
memchr
- 它类似于strchr
,但不需要以NUL结尾的字符串。 - Paul Rstd::find
在 GCC 上没有被优化以利用编译器内部函数。有人应该写一个补丁,这是一个非常明显的优化。 - Konrad RudolphstrXXX
和memXXX
函数都将在编译时进行编译时评估。我认为这不是一个技术问题,阻止GCC使用它。 - David Haim