查找缓冲区中第一次出现字节的最快方法

时间:2016-11-16 13:11:21

标签: c++

声明

我正在寻找识别字节缓冲区中第一次出现给定字节的最快方法。

这让人想起在字符串中第一次出现的字符,除了:

  • 字节缓冲区不是NUL终止的,而是我有一个明确的长度(可能是嵌入的NUL字符)
  • 字节缓冲区未在stringvector中分配,我只传递 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,但我鼓励尽可能通用的答案并清楚地提及假设。

1 个答案:

答案 0 :(得分:4)

你可以使用memchr,它通常是作为内在函数实现的,并且通常(根据我的经验)比任何手动循环快得多。

http://en.cppreference.com/w/c/string/byte/memchr

编辑:至少在VC ++上(我也打赌GCC,我还没有检查),如果你查找一个字节,std::find无论如何都会使用memchr,所以我会检查一下memchr实际上使程序运行得更快。