可能重复:
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++ 争论。如果这两种实现都很慢,我也无所谓。真正伤害的是性能差异。