C ++为什么std :: string比C字符串慢得多

时间:2017-08-04 10:22:43

标签: c++ string performance

我猜这不是秘密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

2 个答案:

答案 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?