c 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等)次调用的时间。代码如下:

67d0865f17d9be527254bf8a8ff6c5b4.gif

1 #include

2 #include

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<

51 ss<

52 ss<

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<

97 cout<

98 cout<

99 cout<

100 if(ss==sprintf && append==plus && ss==plus)

101 {

102 cout<

103 }

104 else

105 {

106 cout<

107 cout<

108 cout<

109 cout<

110 cout<

111 }

112

113 }

67d0865f17d9be527254bf8a8ff6c5b4.gif

测试结果:

在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()。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值