可能重複:
C++ string::find complexity性能的std ::對比的strstr的std :: string ::找到
最近我發現,該功能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++辯論真的很困難。如果兩種實現都很慢,我就不會擔心了。這是真正傷害的性能差異。
@FrerichRaabe:你說的對,這兩個問題有一些重疊。但是我的問題更具體,而另一篇文章沒有回答。 – nosid 2012-04-11 07:11:07
@nosid:是的。尤其要特別注意dietmar kuhl在評論中關於平均情況對最壞情況和空間複雜度的額外解釋,爲什麼這很可能不被使用。如果從頭開始重用執行算法的'std :: memmem',那麼這些參數不會改變。 – KillianDS 2012-04-11 07:15:42