【转载,实用】c++拼接字符串效率比较(+=、append、stringstream、sprintf)

原文:http://blog.sina.com.cn/s/blog_858820890101cmo5.html

转自: http://www.cnblogs.com/james6176/p/3222671.html

最近写的程序用到大量拼接字符串,为了提高拼接效率,比较了一下+=、append、stringstream、sprintf四种拼接字符串的方法。

测试方法

      比较方法是写了4个函数,分别用+=、append、stringstream、sprintf的方式来拼接字符串,拼接方法是将s1="abcedfg",s2="hijklmn",s3="opqrst"三个字符串拼接到一起,总共循环60次。然后在main函数中依次调用这4个函数,并打时间戳来计时。为了使时间差异更明显,可以取循环N(N可以为100或是1000000等)次调用的时间。代码如下:

复制代码
  1 #include 
  2 #include <<span style="color: rgb(0, 0, 255); font-family: 'Courier New' !important;">string>
  3 #include 
  4 #include 
  5 #include 
  6 using namespace std;
  7 #define OUT_IN_REPEATE_NUM 10000
  8 #define IN_REPEATE_NUM 60
  9 
 10 string s1="abcedfg";
 11 string s2="hijklmn";
 12 string s3="opqrst";
 13 void  plusTest(string& ret)
 14 {
 15     for(int i=0; i)
 16     {
 17         ret += s1;
 18         ret += s2;
 19         ret += s3;
 20     }
 21 }
 22 void  appendTest(string& ret)
 23 {
 24     for(int i=0; i)
 25     {
 26         ret.append(s1);
 27         ret.append(s2);
 28         ret.append(s3);
 29     }
 30 }
 31 void sprintfTest(string& ret)
 32 {
 33     const size_t length=26*IN_REPEATE_NUM;
 34     char tmp[length];
 35     char* cp = tmp;
 36     size_t strLength=s1.length()+s2.length()+s3.length();
 37     for(int i=0; i)
 38     {
 39         sprintf(cp,"%s%s%s", s1.c_str(), s2.c_str(),s3.c_str());
 40         cp+=strLength;
 41     }
 42     ret = tmp;
 43 }
 44 
 45 void  ssTest(string& ret)
 46 {
 47     stringstream ss;
 48     for(int i=0; i)
 49     {
 50         ss<<s1;
 51         ss<<s2;
 52         ss<<s3;
 53     }
 54     ret = ss.str();
 55 }
 56 int main() {
 57     string ss, plus, append, sprintf;
 58     struct timeval sTime, eTime;
 59 
 60     gettimeofday(&sTime, NULL);
 61     for(int i=0; i)
 62     {
 63         sprintf="";
 64         sprintfTest(sprintf);
 65     }
 66     gettimeofday(&eTime, NULL);
 67     long SprintfTime = (eTime.tv_sec-sTime.tv_sec)*1000000+(eTime.tv_usec-sTime.tv_usec); //exeTime 单位是微秒
 68 
 69     gettimeofday(&sTime, NULL);
 70     for(int i=0; i)
 71     {
 72         append="";
 73         appendTest(append);
 74     }
 75     gettimeofday(&eTime, NULL);
 76     long AppendTime = (eTime.tv_sec-sTime.tv_sec)*1000000+(eTime.tv_usec-sTime.tv_usec); //exeTime 单位是微秒
 77 
 78     gettimeofday(&sTime, NULL);
 79     for(int i=0; i)
 80     {
 81         ss="";
 82         ssTest(ss);
 83     }
 84     gettimeofday(&eTime, NULL);
 85     long SsTime = (eTime.tv_sec-sTime.tv_sec)*1000000+(eTime.tv_usec-sTime.tv_usec); //exeTime 单位是微秒
 86 
 87     gettimeofday(&sTime, NULL);
 88     for(int i=0; i)
 89     {
 90         plus="";
 91         plusTest(plus);
 92     }
 93     gettimeofday(&eTime, NULL);
 94     long PlusTime = (eTime.tv_sec-sTime.tv_sec)*1000000+(eTime.tv_usec-sTime.tv_usec); //exeTime 单位是微秒
 95 
 96     cout<<"PlusTime is :   "<<PlusTime<<endl;
 97     cout<<"AppendTime is : "<<AppendTime<<endl;
 98     cout<<"SsTime is :     "<<SsTime<<endl;
 99     cout<<"SprintfTime is :"<<SprintfTime<<endl;
100     if(ss==sprintf && append==plus && ss==plus)
101     {
102         cout<<"They are same"<<endl;
103     }
104     else
105     {
106         cout<<"Different!"<<endl;
107         cout<<"Sprintf: "<<sprintf<<endl;
108         cout<<"ss:        "<<ss<<endl;
109         cout<<"Plus:     "<<plus<<endl;
110         cout<<"Append:"<<append<<endl;
111     }
112 
113 }
复制代码

测试结果:     

在Linux环境下用g++编译以上代码,运行结果如下(时间单位为μm):

外层循环1000000

外层循环100000

外层循环10000

外层循环1000

外层循环100

PlusTime is     3405450

AppendTime is 4020078

SsTime is       7835499

SprintfTime is 14875433

They are same

PlusTime is     337229

AppendTime is 401719

SsTime is       788242

SprintfTime is  1517999

They are same

PlusTime is    32177

AppendTime is 40265

SsTime is       78928

SprintfTime is 150839

They are same

PlusTime is     3402

AppendTime is 4074

SsTime is       7984

SprintfTime is  15425

They are same

PlusTime is      369

AppendTime is 429

SsTime is         921

SprintfTime is  1591

They are same

 结论:

根据以上结果,如果是使用Linux系统并且是g++(gcc)编译器,大量拼接字符串的效率从高到低依次为:+=、append()、stringstream、sprintf()。

——菜鸟吉姆斯原创,如有错误,敬请指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值