声明
strchr
需要以NUL结尾的字符串 我正在寻找识别字节缓冲区中第一次出现给定字节的最快方法。
这让人想起在字符串中第一次出现的字符,除了:
string
或vector
中分配,我只传递 slice (又名,指针和长度)基本解决方案是:
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,但我鼓励尽可能通用的答案并清楚地提及假设。
答案 0 :(得分:4)
你可以使用memchr
,它通常是作为内在函数实现的,并且通常(根据我的经验)比任何手动循环快得多。
http://en.cppreference.com/w/c/string/byte/memchr
编辑:至少在VC ++上(我也打赌GCC,我还没有检查),如果你查找一个字节,std::find
无论如何都会使用memchr
,所以我会检查一下memchr
实际上使程序运行得更快。