for循环优化_C++|从字符串的角度谈性能优化(同一功能,9个函数版本)

字符串概念上很简单,但想要实现高效的字符串却很微妙,字符串是动态分配的,它们在表达式中的行为与值相似,而且实现它们需要大量的复制操作。

尝试字符串优化,直观看代码,有关细节在代码的注释中有标识:

e18cff88524c3c70444ebd1ea569771d.png
#include #include using namespace std;string strFilter(string s)//需要优化{string ret;for(int i=0; i=0x20)//32,ASCII中,1-32都是控制字符,包括换行、回车符、制表符、空格等;ret=ret+s[i];// 字符串连接符会生成一个临时对象,调用s.length()次内存管理器// 来分配内存和释放内存// 赋值操作可能还会分配额外的字符串,取决于字符串是如何实现的return ret;}string strFilter1(string s)// 1st优化:使用复合赋值操作避免临时字符串{string ret;for(int i=0; i=0x20)ret+=s[i];// 通过使用复合赋值操作,避免字符串连接符操作产生的开销// 仍会导致ret变长的操作,会反复地复制到一个更大的内存缓冲区中return ret;}string strFilter2(string s)// 2nd优化:通过预留存储空间减少内存的重新分配{// 参数复制操作会产生额外开销string ret;ret.reserve(s.length());for(int i=0; i=0x20)ret+=s[i];return ret;}string strFilter3(string& s)// 3rd优化:使用引用传址,消除对参数字符串的复制{string ret;ret.reserve(s.length());for(int i=0; i=0x20)// 引用变量是用指针实现的,编译器要实现解引用,这会带来开销ret+=s[i];return ret;}string strFilter4(string& s)// 4th优化:使用迭代器消除引用的自动解引用// 字符串的值返回方式会带来开销{string ret;ret.reserve(s.length());for(string::iterator it=s.begin(),end=s.end(); it!=end; ++it) //迭代器是简单指针,可以在循环中节省两次解引用操作if(*it >=0x20)ret+=*it;return ret;}void strFilter5(string& ret, string& s)// 5th优化:消除对返回的字符串的复制// string对象有安全性,但效率还是不及C风格字符串{//ret.clear();ret.reserve(s.length());for(string::iterator it=s.begin(),end=s.end(); it!=end; ++it) if(*it >=0x20)ret+=*it;}void strFilter6(char* destp, char const* srcp)// 6th优化:使用C风格字符串{// 单个字符串操作导致了最差的内存分配行为char* p=destp;while(*srcp!='0'){if(*srcp>=0x20)*p++ = *srcp;srcp++;}*p = '0';}string strFilter7(string s)// 7th优化:算法优化,通过子字符串移动减少外层循环{string ret;for(size_t b=0,i=b,e=s.length(); b

另外,更好的编译器、更好的字符串库、更好的迭代器都是优化的方向。

参考:

-End-

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值