转自: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()。

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

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

  1. String拼接字符串效率低,你知道原因吗?

    面试官Q1:请问为什么String用"+"拼接字符串效率低下,最好能从JVM角度谈谈吗? 对于这个问题,我们先来看看如下代码: public class StringTest { ...

  2. java 几种拼接字符串的效率问题

    拼接字符串,大致有3个class可以用,他们是String, StringBuffer,StringBuilder, StringBuilder是1.5中来代替StringBuffer的.检验方法如下 ...

  3. 谈JavaScript组合拼接字符串的效率 --转载

    JavaScript组合拼接字符串的效率.在脚本开发过程中,经常会按照某个规则,组合拼接出一个大字符串进行输出.比如写脚本控件时控制整个控件的外观的HTML标签输出,比如AJAX里得到服务器端的回传值 ...

  4. Golang拼接字符串的5种方法及其效率_Chrispink-CSDN博客_golang 字符串拼接效率 https://blog.csdn.net/m0_37422289/article/details/103362740

    Different ways to concatenate two strings in Golang - GeeksforGeeks https://www.geeksforgeeks.org/di ...

  5. Lua大量字符串拼接方式效率对比及原因分析

    Lua大量字符串拼接方式效率对比及原因分析_AaronChan的博客-CSDN博客_lua字符串拼接消耗 https://blog.csdn.net/qq_26958473/article/detai ...

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

    Sql动态查询拼接字符串的优化 最原始的 直接写:string sql="select * from TestTables where 1=1";... 这样的代码效率很低的,这样 ...

  7. C# 拼接字符串的几种方式和性能

    开发过程中常用到的拼接字符串的方法有三种: 1 简单 “+=” 拼接法 1 2 3 4 5 string str="a";   str+="c"+"d ...

  8. StringBuilder(拼接字符串省内存)

    观察如下代码: String s = ""; for (int i = 0; i < 1000; i++) { s = s + "," + i; } 虽然 ...

  9. 昨天还在for循环里写加号拼接字符串的那个同事,今天已经不在了

    引言 都说 StringBuilder 在处理字符串拼接上效率要强于 String,但有时候我们的理解可能会存在一定的偏差.最近我在测试数据导入效率的时候就发现我以前对 StringBuilder 的 ...

随机推荐

  1. QT中16进制字符串转汉字

    最经在研究AT指令接受短信,短信是unicode编码,接受后需要根据系统的编码方案进行相关的转码比如接受到了一串字符4F60597D,它是“你好”的unicode编码,一个unicode编码占两个字节 ...

  2. photoshop:制作木板木纹

    1.设置颜色为木头相近颜色 2.滤镜->渲染->云彩 3.滤镜->杂色->添加杂色 4.滤镜->模糊->动感模糊 5.用矩形选取选取某块区域 6.滤镜->扭曲 ...

  3. ZOJ1586——QS Network(最小生成树)

    QS Network DescriptionIn the planet w-503 of galaxy cgb, there is a kind of intelligent creature nam ...

  4. P114、面试题17:合并两个排序的链表

    题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增顺序的.struct ListNode{      int    m_nKey;      ListNode*    m_p ...

  5. linux中应用程序main函数中没有开辟进程的,它应该在那个进程中运行呢?

    1.main函数是一个进程还是一个线程? 不知道你是用c创建的,还是用java创建的. 因为它们都是以main()做为入口开始运行的. 是一个线程,同时还是一个进程. 在现在的操作系统中,都是多线程的 ...

  6. dom解析器机制 web基本概念 tomcat

    0 作业[cn.itcast.xml.sax.Demo2]   1)在SAX解析器中,一定要知道每方法何时执行,及SAX解析器会传入的参数含义 1 理解dom解析器机制 1)dom解析和dom4j原理 ...

  7. window.addEventListener来解决让一个js事件执行多个函数

    可能你也碰到过这种情况,就是在js的代码中用了window.onload后,可能会影响到body中的onload事件.这时就要用window.attachEvent和window.addEventLi ...

  8. 【HDOJ】4056 Draw a Mess

    这题用线段树就MLE.思路是逆向思维,然后每染色一段就利用并查集将该段移除,均摊复杂度为O(n*m). /* 4056 */ #include <iostream> #include &l ...

  9. Java数据库增删改查

    数据库为MySQL数据库,Oracle数据库类似: create database db_test;--创建数据库 ';--创建用户 grant all privileges on db_test.* ...

  10. poj12月其他题解(未完)

    最近编程的时间比较少啊…… poj3253 就是个合并果子,各种优先队列即可(显然单调队列最优) poj3263 线段树统计每个点被覆盖了多少次即可,注意要去重 poj3625 最小生成树 poj36 ...