7

可能重复:
C++ string::find complex

最近我注意到该函数std::string::find比函数慢一个数量级std::strstr- 在我的 Linux 上使用 GCC 4.7 的环境中。性能差异取决于字符串的长度和硬件架构。

差异似乎有一个简单的原因:std::string::find基本上std::memcmp是循环调用 - 具有时间复杂度O(m * n)。相比之下,std::strstr它针对硬件架构进行了高度优化(例如,使用 SSE 指令)并使用更复杂的字符串匹配算法(显然是 Knuth-Morris-Pratt)。

我也很惊讶没有在语言文档(即草稿 N3290 和 N1570)中发现这两个函数的时间复杂度。我只发现char_traits. 但这无济于事,因为char_traits.

我希望,它std::strstr包含memmem具有几乎相同性能的类似优化。直到最近,我还假设在内部std::string::find使用memmem

问题是:有什么好的理由,为什么std::string::find不使用std::memmem?它在其他实现中是否有所不同?

问题不是:这个功能的最佳实现是什么?如果 C++ 比 C 慢,那么它真的很难为 C++ 争论。如果这两种实现都很慢,我也无所谓。真正伤害的是性能差异。

4

1 回答 1

2

首先,什么是memmem?我在 C++ 标准和 Posix 标准(包含所有标准 C 函数)中找不到这个。

其次,任何测量值都取决于实际数据。例如,在很多情况下,使用 KMP 将是一种悲观;可能是使用成员函数的大多数情况std::string;建立必要表格的时间通常会超过直接算法的总时间。当字符串的典型长度很短时,类似O(m*n) 的事情并没有多大意义。

于 2012-04-11T08:09:14.153 回答