事情起因很简单,自己的代码中使用了stringstream对象进行字符串的拼接,然后被老同事质疑效率低下。借着这个机会了解下为什么?

一、+=、append、stringsteam、sprintf四种字符串拼接方法比较

C/C++中字符串拼接的使用场景非常多,字符串拼接的方法也非常多,这里简单的比对下上述四种方法的效率。

测试方法:分别采用+=、append、stringstream、sprintf的方式来拼接字符串。s1=“aaaaa”,s2=“bbbbb”,s3=“ccccc”。内层循环将这三个字符串拼接100次;此外还有一个外层循环,循环次数自己定义(此处设为100000)。程序如下:

#include <iostream>
#include <string>
#include <sys/time.h>
#include <sstream>
#include <stdio.h>
using namespace std;
#define OUT_IN_REPEATE_NUM 100000
#define IN_REPEATE_NUM 100  //内层循环将s1、s2、s3循环拼接100次string s1="aaaaaa";
string s2="bbbbbb";
string s3="cccccc";void  plusTest(string& ret)
{for(int i=0; i<IN_REPEATE_NUM; i++){ret += s1;ret += s2;ret += s3;}
}
void  appendTest(string& ret)
{for(int i=0; i<IN_REPEATE_NUM; i++){ret.append(s1);ret.append(s2);ret.append(s3);}
}
void sprintfTest(string& ret)
{const size_t length=26*IN_REPEATE_NUM;char tmp[length];char* cp = tmp;size_t strLength=s1.length()+s2.length()+s3.length();for(int i=0; i<IN_REPEATE_NUM; i++){sprintf(cp,"%s%s%s", s1.c_str(), s2.c_str(),s3.c_str());cp+=strLength;}ret = tmp;
}void  ssTest(string& ret)
{stringstream ss;for(int i=0; i<IN_REPEATE_NUM; i++){ss<<s1;ss<<s2;ss<<s3;}ret = ss.str();
}
int main() {string ss, plus, append, sprintf;struct timeval sTime, eTime;gettimeofday(&sTime, NULL);for(int i=0; i<OUT_IN_REPEATE_NUM; i++){sprintf="";sprintfTest(sprintf);}gettimeofday(&eTime, NULL);long SprintfTime = (eTime.tv_sec-sTime.tv_sec)*1000000+(eTime.tv_usec-sTime.tv_usec); //exeTime 单位是微秒gettimeofday(&sTime, NULL);for(int i=0; i<OUT_IN_REPEATE_NUM; i++){append="";appendTest(append);}gettimeofday(&eTime, NULL);long AppendTime = (eTime.tv_sec-sTime.tv_sec)*1000000+(eTime.tv_usec-sTime.tv_usec); //exeTime 单位是微秒gettimeofday(&sTime, NULL);for(int i=0; i<OUT_IN_REPEATE_NUM; i++){ss="";ssTest(ss);}gettimeofday(&eTime, NULL);long SsTime = (eTime.tv_sec-sTime.tv_sec)*1000000+(eTime.tv_usec-sTime.tv_usec); //exeTime 单位是微秒gettimeofday(&sTime, NULL);for(int i=0; i<OUT_IN_REPEATE_NUM; i++){plus="";plusTest(plus);}gettimeofday(&eTime, NULL);long PlusTime = (eTime.tv_sec-sTime.tv_sec)*1000000+(eTime.tv_usec-sTime.tv_usec); //exeTime 单位是微秒cout<<"PlusTime is :   "<<PlusTime<<endl;cout<<"AppendTime is : "<<AppendTime<<endl;cout<<"SsTime is :     "<<SsTime<<endl;cout<<"SprintfTime is :"<<SprintfTime<<endl;if(ss==sprintf && append==plus && ss==plus){cout<<"result string are same!"<<endl;}else{cout<<"Different!"<<endl;cout<<"Sprintf: "<<sprintf<<endl;cout<<"ss:        "<<ss<<endl;cout<<"Plus:     "<<plus<<endl;cout<<"Append:"<<append<<endl;}}

结果如下:可以看到+=、append、stringstream、sprintf四种方式在消耗的时间大致为1:1:4:2。好吧,stringstream确实好慢,人家说的是对的。

二、关于stringstream

stringstream优点:可以方便的以流运算符<<将数值以各种数据(字串、数值)写入stringstream对象,且不用担心写越界等问题;其中类型安全不会溢出的特性非常抢眼。

stringstream缺点:相对于其他方法效率较低。一方面写入时的动态内存分配需要一定的开销,另一方面其成员函数str()在去除字符串的时候会进行一次字符串的值拷贝也影响效率。

stringstream对象的构造和析构函数通常是非常消耗时间,毕竟涉及到内存的分配、对象的构造。上述测试结果也显示其效率明显低于”+=”、“append“。当然这个时间消耗也是和stringstream对象被创建了多少次密切相关的。也就是说如果能在多次转换(for循环)中重复使用同一个stringstream(而不是每次都创建一个新的对象)就还好。但是记得每次循环使用前使用clear()、str("")方法(如下)。

void* test_stringstream(void * arg)
{stringstream oss;for(int i=0;i<10000;i++){oss.clear();这仅仅置流标记oss.str("");/这是才是真正清空操作oss << i;}
}

C++字符串拼接效率比较(+=、append、stringstream、spintf)相关推荐

  1. java 字符串拼接优化_JAVA字符串拼接效率

    比较string.stringbuffer.stringbuilder拼接效率 public class MainTest { public static void main(String[] arg ...

  2. js字符串拼接效率问题

    一般来说字符串拼接我们会直接去将String相加,前端一般不考虑效率问题,但是如果数据量大,我们还是要考虑那么亿点点: 这里我们来测试一下字符串拼接和数组拼接后利用join方法生成字符串的效率: 我们 ...

  3. Java 字符串拼接效率比较

    1 字符串拼接的三种方法 ① 加号 ② concat方法 ③ StringBuilder(或StringBuffer)的append方法 2 程序例子 package com.jtzen9; publ ...

  4. php 字符串拼接效率,php中3种字符串连接的效率比较实例详解

    php大致有三种字符串连接: 1.直接用.来进行连接. 2.用.=进行连接. 3.先压入数组,再通过join函数连接. 下面分别对这三种方法的效率进行测试: 第一种方法代码如下:<?php fu ...

  5. 字符串拼接的几种方式

    + 号拼接 通过+拼接是最常见的拼接方式,这个应该算是最简单的一种方式了,但是很遗憾得玩告诉你,阿里巴巴在他们的规范里面之处不建议在 for 循环里面使用 "+" 进行字符串的拼接 ...

  6. 测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率

    之前一篇里写过字符串常用类的三种方式<java中的字符串相关知识整理>,只不过这个只是分析并不知道他们之间会有多大的区别,或者所谓的StringBuffer能提升多少拼接效率呢?为此写个简 ...

  7. C# 字符串拼接性能探索 c#中+、string.Concat、string.Format、StringBuilder.Append四种方式进行字符串拼接时的性能...

    本文通过ANTS Memory Profiler工具探索c#中+.string.Concat.string.Format.StringBuilder.Append四种方式进行字符串拼接时的性能. 本文 ...

  8. 字符串拼接、效率对比

    字符串拼接,大多数时候都是直接选择+这种简单.暴力的方式,如果数据量感觉不到对性能影响有多大,实际在不同的场景,选择不同的拼接方式,还是很有必要的,而且+这种方式看着就很Low,是不是? 下面对几种字 ...

  9. C++-std:stringstream【数据类型转换、多个字符串拼接、分割字符串】

    首先,需要包含头文件<sstream>: #include <sstream> <sstream> 定义了三个类:istringstream.ostringstre ...

  10. JS拼接字符串的效率

    JS拼接字符串的方式, 1.最常见的是+=: 2.还可以先将字符串转化为数组,然后调用Join实现字符串拼接 arr.push(str); return arr.join(""); ...

最新文章

  1. 阿里月薪5万招程序员,招聘要求让人窒息!
  2. 阿里巴巴AI夺肝结节诊断两项世界冠军,至今无人超越
  3. VC下调用x264进行视频编码,
  4. 采用开源技术的好处_采用开源的6个技巧
  5. MFC中由左键单击模拟左键双击引起的问题
  6. python 如何查看列表的维度?
  7. 网络管理与维护作业13
  8. 如何使用SSH密钥登录你的云服务器?使用SSH密钥的好处
  9. 在线拍卖系统代码_来了来了,轻工业领域拍卖的福利来啦!聚拍网终于扩展新范围啦...
  10. Expression Blend学习四控件-按钮
  11. 自定义C语言头文件书写格式
  12. 单工,半双工,全双工区别以及TDD和FDD区别
  13. 回顾|Apache Flink Meetup · 北京站(附问题解答 PPT 下载)
  14. 同一个局域网内如何共享文件夹(含共享打印机操作方法)
  15. busybox linux使用教程,使用BusyBox制作Linux根文件系统
  16. 谈谈如何设计好网站的 URL
  17. 如何用微信公众号快速注册小程序
  18. 构建栅格地图matlab代码
  19. 一男老师每日百词转载+连载(2)
  20. 以太坊之Windows DApp开发环境的搭建

热门文章

  1. python窗口怎么显示我输入的_Python分别用两个窗口显示和输入
  2. Android 布局系列篇
  3. 《Flutter 从0到1构建大前端应用》读后感—第7章【路由】
  4. Fluter拓展 图标库
  5. Linux中log打印输入输出的格式字符串
  6. python 字符串 string模块导入及用法
  7. 将input 的文本框改为不可编辑状态
  8. 轻松学习JavaScript二十一:DOM编程学习之获取元素节点的子节点和属性节点
  9. 小组成员的github地址
  10. 'WebElement' object is not iterable