C++字符串拼接效率比较(+=、append、stringstream、spintf)
事情起因很简单,自己的代码中使用了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)相关推荐
- java 字符串拼接优化_JAVA字符串拼接效率
比较string.stringbuffer.stringbuilder拼接效率 public class MainTest { public static void main(String[] arg ...
- js字符串拼接效率问题
一般来说字符串拼接我们会直接去将String相加,前端一般不考虑效率问题,但是如果数据量大,我们还是要考虑那么亿点点: 这里我们来测试一下字符串拼接和数组拼接后利用join方法生成字符串的效率: 我们 ...
- Java 字符串拼接效率比较
1 字符串拼接的三种方法 ① 加号 ② concat方法 ③ StringBuilder(或StringBuffer)的append方法 2 程序例子 package com.jtzen9; publ ...
- php 字符串拼接效率,php中3种字符串连接的效率比较实例详解
php大致有三种字符串连接: 1.直接用.来进行连接. 2.用.=进行连接. 3.先压入数组,再通过join函数连接. 下面分别对这三种方法的效率进行测试: 第一种方法代码如下:<?php fu ...
- 字符串拼接的几种方式
+ 号拼接 通过+拼接是最常见的拼接方式,这个应该算是最简单的一种方式了,但是很遗憾得玩告诉你,阿里巴巴在他们的规范里面之处不建议在 for 循环里面使用 "+" 进行字符串的拼接 ...
- 测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率
之前一篇里写过字符串常用类的三种方式<java中的字符串相关知识整理>,只不过这个只是分析并不知道他们之间会有多大的区别,或者所谓的StringBuffer能提升多少拼接效率呢?为此写个简 ...
- C# 字符串拼接性能探索 c#中+、string.Concat、string.Format、StringBuilder.Append四种方式进行字符串拼接时的性能...
本文通过ANTS Memory Profiler工具探索c#中+.string.Concat.string.Format.StringBuilder.Append四种方式进行字符串拼接时的性能. 本文 ...
- 字符串拼接、效率对比
字符串拼接,大多数时候都是直接选择+这种简单.暴力的方式,如果数据量感觉不到对性能影响有多大,实际在不同的场景,选择不同的拼接方式,还是很有必要的,而且+这种方式看着就很Low,是不是? 下面对几种字 ...
- C++-std:stringstream【数据类型转换、多个字符串拼接、分割字符串】
首先,需要包含头文件<sstream>: #include <sstream> <sstream> 定义了三个类:istringstream.ostringstre ...
- JS拼接字符串的效率
JS拼接字符串的方式, 1.最常见的是+=: 2.还可以先将字符串转化为数组,然后调用Join实现字符串拼接 arr.push(str); return arr.join(""); ...
最新文章
- 阿里月薪5万招程序员,招聘要求让人窒息!
- 阿里巴巴AI夺肝结节诊断两项世界冠军,至今无人超越
- VC下调用x264进行视频编码,
- 采用开源技术的好处_采用开源的6个技巧
- MFC中由左键单击模拟左键双击引起的问题
- python 如何查看列表的维度?
- 网络管理与维护作业13
- 如何使用SSH密钥登录你的云服务器?使用SSH密钥的好处
- 在线拍卖系统代码_来了来了,轻工业领域拍卖的福利来啦!聚拍网终于扩展新范围啦...
- Expression Blend学习四控件-按钮
- 自定义C语言头文件书写格式
- 单工,半双工,全双工区别以及TDD和FDD区别
- 回顾|Apache Flink Meetup · 北京站(附问题解答 PPT 下载)
- 同一个局域网内如何共享文件夹(含共享打印机操作方法)
- busybox linux使用教程,使用BusyBox制作Linux根文件系统
- 谈谈如何设计好网站的 URL
- 如何用微信公众号快速注册小程序
- 构建栅格地图matlab代码
- 一男老师每日百词转载+连载(2)
- 以太坊之Windows DApp开发环境的搭建