2017-08-04 40 views
-10

我想這要慢得多是不是祕密的std :: string比C字符串慢得多(在大多數的各個方面:配置,比較,搜索):C++爲什麼的std :: string比C字符串

// alloc 
malloc/memcpy : 1.972 secs 
std::string : 2.259 secs 
// compare 
strcmp : 1.319 secs 
std::string.compare : 15.802 secs 
// search 
strstr : 5.045 secs 
memmem : 1.345 secs 
std::string.find : 7.774 secs 

所以我在這裏的問題不是如何解決它,但爲什麼std :: string是緩慢的(什麼STL做錯了或我錯了)?這種緩慢使得std :: string幾乎沒用。因此,在關聯容器中使用std :: string作爲關鍵字會使事情變得更糟(因爲插入/搜索時需要進行比較)。

只是要注意唯一的例外是std :: string被複製得非常快 - 因爲它被ref-counting(認爲GCC 5認爲刪除了它)。

附上我的基準代碼: https://drive.google.com/file/d/0B_jw6pBAvP6bSEtmLTA4RU5zZ00/view?usp=sharing

的代碼生成使用:

g++ -O2 -g perf_cstr_vs_std.cpp -o perf_cstr_vs_std 

編譯/運行環境:

RedHat6 VM + gcc 4.4.7 
+0

如果您認爲沒用,請不要使用它 –

+5

如果您沒有顯示測試代碼,您會得到最終的投票結果。最有可能的情況是你的測試用例沒有測試相同的東西。 –

+2

你不清楚你在比較什麼。 std :: string是慢的,如果你用它做的東西,你不會用「c-string」(不管是什麼)。但請注意,涉及到字符串的許多操作(例如獲取子字符串)涉及創建新的字符串對象分配自己的內存並保存數據副本。新的['std :: string_view'](http://en.cppreference.com/w/cpp/string/basic_string_view)修復了其中一些問題。 – juanchopanza

回答

0

所有這裏使用的是1000次重複的字符串'a'或'A'可能無法準確估計時間。

C++:201103,GCC:4.9.2

測試操作numIters:千萬numRuns:1個numItems的:1000

1周

的malloc/memcpy的:1.512秒

realloc/memcpy:1.634 secs

std :: string:1.956 secs

爲什麼?引用計數???在工作中使用的5.x.x不會執行此操作。

STRCMP:10.780秒

的std :: string.compare(爲const char * S):5.346秒

OK,我的版本比較,比的strcmp快...

static int 
    compare(const char_type* __s1, const char_type* __s2, size_t __n) 
    { return __builtin_memcmp(__s1, __s2, __n); } 

so std :: string必須先做一個strlen才能調用它,但之後它可以更高效。

的std :: string ==的std :: string:2.356秒

STRNCMP:10.796秒memcmp:2.355秒

的std :: string.compareN:5.453秒

的strstr: 4.027秒

std :: string.find:6。061秒

查找可以實現更高效,C++17得到Boyer-Moore-Horspool字符串搜索算法。

0

相當有趣的結果。我已經在4.8.2 20140120上重新運行基準測試並得到:

strcmp : 1.938 secs 
std::string.compare(const char* s) : 1.842 secs 
std::string == std::string : 1.225 secs 
strncmp : 2.660 secs 
memcmp : 1.182 secs 
std::string.compareN : 1.711 secs 

strstr : 5.854 secs 
memmem : 1.187 secs 
std::string.find : 14.363 secs 

所以std :: string的行爲不同。 關於重新計數,請參閱Is std::string refcounted in GCC 4.x/C++11?

相關問題