c++拼接字符串效率比较(+=、append、stringstream、sprintf)

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

c++拼接字符串效率比较(+=、append、stringstream、sprintf)

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

测试方法

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

  1 #include <iostream>
  2 #include <string>
  3 #include <sys/time.h>
  4 #include <sstream>
  5 #include <stdio.h>
  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<IN_REPEATE_NUM; 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<IN_REPEATE_NUM; 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<IN_REPEATE_NUM; 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<IN_REPEATE_NUM; 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<OUT_IN_REPEATE_NUM; 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<OUT_IN_REPEATE_NUM; 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<OUT_IN_REPEATE_NUM; 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<OUT_IN_REPEATE_NUM; 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()。

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

时间: 2024-10-10 19:58:12

c++拼接字符串效率比较(+=、append、stringstream、sprintf)的相关文章

【JS】【8】拼接字符串

var roleidArray = new Array(""); for(i = 0; i < rightRows.length; i++) { roleidArray.push(rightRows[i].id); } roleidArray = roleidArray.join(",").substring(1); 参考博客: 浅谈jquery拼接字符串效率比较高的方法_jquery_脚本之家https://www.jb51.net/article/1064

Sql动态查询拼接字符串的优化

Sql动态查询拼接字符串的优化 最原始的 直接写:string sql="select * from TestTables where 1=1";... 这样的代码效率很低的,这样影响了数据库的索引引用如下所示:private void TestOneMethod()        {             string querySql = "select * from TestTables where 1=1";            if (hasOneCo

关于前端js拼接字符串的一点小经验

1.今天在做项目的时候遇到一个问题,就是使用onclick="xxx()"  点击事件的时候,参数如果为全数字就会出现点击无反应的问题.但是当参数为字符串或者动态内容的时候就会出现事件无法响应.比如onclick="add("abc")";这样在add方法中无法获取到参数. 解决办法:是用转移字符,onclick="add(\'abc\')";这样在方法中就可以使用了.         2.还有一个是在做拼接字符串的时候,如果

knockoutJS学习笔记01:从拼接字符串到编写模板引擎

开篇 关于knockout的文章,园里已经有很多大神写过了,而且都写得很好.其实knockout学习起来还是很容易的,看看官网的demo和园里的文章,练习练习就可以上手了(仅限使用,不包含研究源码).之所以想写这个系列,主要是想记录自己的学习和应用过程,也希望能给初学者一点帮助. 既然是学习过程就一步一步来,从最开始的解决方案,到优化过程,到最后的实现方案.有了思考和对比,才会更加明白这个东西有什么好处,为什么使用它.什么情况要使用它.ok, 官网学习链接为?:knockoutJS 准备例子 过

java拼接字符串用StringBuilder

StringBuilder builder = new StringBuilder(); String s1="abc"; for(int i=0;i<10000000;i++) { builder.append(s1); } 拼接字符串用stringbuilder,不要用string,测试下代码运行时间就知道了

在页面中使用拼接字符串的方式显示动态加载的数据

在做页面的时候为了使页面美化,我们经常会用拼接字符串的方式,动态加载后台的数据,这里我们使用的前台框架是bootstrap,但是很多效果还是要用jquery来实现 (1)方法传参与字符串的拼接  (拼接用的replace) 先声明一个展示数据的页面模型(使用过的模型1) var userModel = "<div class=\"itemdiv commentdiv\" style=\"margin-left: 7%;\">"+ &q

python拼接字符串

可以用+, 跟C#一样,效率有问题,用join,join的用法如下: print '张三丰'.join('lisi')   打印出的会是:l张三丰i张三丰s张三丰i 那么要拼接怎么搞呢? for d in os.listdir('d:\\'): print ':::'.join([d,'file' if os.path.isfile(d) else 'dir']) 如果要拼接成   张三丰 是 好人 a=['张三丰','是','好人'] ''.join(a) python拼接字符串

拼接字符串 去除所有可能的重复

比如拼接2个页面的某信息 A页面 : 1.2.3.4.5 B页面: 2.3.4.5.6. 拼接后 只需要  1.2.3.4.5.6 不需要 1.2.2.3.3.4.4.5.5.6 var geoCoords = worldfoot.Replace(" ", "").Replace("\r\n", "").Split(new string[] { "]," }, StringSplitOptions.Remo

拼接字符串时去掉最后一个多余逗号

当我们遍历拼接字符串的时候,最后会多出一个我们添加的字符(比如逗号). 方式一: String str[] = { "hello", "beijing", "world", "shenzhen" }; StringBuffer buf = new StringBuffer(); for (int i = 0; i < str.length; i++) { buf.append(str[i]).append(",