我猜这不是秘密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的复制速度非常快 - 因为它被重新计数(以为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 :(得分:0)
这里使用的所有字符串都是1000次重复的' a'或者' A'这可能无法准确估计时间。
C ++:201103,GCC:4.9.2
测试操作数:10000000 numRuns:1 numItems:1000
运行1
malloc / memcpy:1.512秒
realloc / memcpy:1.634秒
std :: string:1.956秒
为什么呢?引用计数???工作中使用的5.x.x并不是这样做的。
strcmp:10.780秒
std :: string.compare(const char * s):5.346秒
好的,我的比较版本比strcmp快......
static int
compare(const char_type* __s1, const char_type* __s2, size_t __n)
{ return __builtin_memcmp(__s1, __s2, __n); }
所以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字符串搜索算法。
答案 1 :(得分: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?