string读取字符串字符时出错_你知道吗?string比字符串快20%

看了很多人的代码,发现都没注意到这个细节。

零、背景

最近在思考性能优化的事情。

说起性能优化,大家都知道能用引用的地方就不要使用赋值copy。

关于左值引用&与右值引用&&相信大家都已经很熟悉了。
如果你不了解左值引用,可以去看一下c++的基础书籍,任何一本都有介绍。
如果右值引用你不了解,可以看《学习 c++11 之 右值引用》这篇文章。

那既然说到不要赋值 copy,我看了无数人的代码,有一个细节几乎所有人都忽略了,都在使用赋值copy。

没错,就是map里的字符串 key。

一、有问题的代码

相信大家都看过这样的代码

map<string, string> m;

m["one"] = 1;

auto it = m.find("one")

大家可曾想过字符串与string之间的关系?

是的,字符串需要先隐式转化为 string,那这个转化就存在一次默认构造与 字符串copy了。

假设一个服务qps是几十万,每次请求大量的使用了字符串map查找,那是不是就存在大量的隐式转化带来的性能损耗呢?

二、性能损耗

其实,关于这个问题我在四年前已经测试过了。

7400bfb1a07f409edbcb93c0e5ae9f82.png

当时我对所有常用的语法全部进行了压测。

71c23651956b3d9c855c0eb1520bd940.png

今天,我再次运行了这个测试程序,性能差异之大依旧令我不敢置信。

压测程序源码我使用c++11重写了,代码如下,有三个函数。charFun是字符串查找压测函数stringFun是string查找压测函数avgFun这里运行5轮求平均值。

7d9c86ddb43ff72c15f60ddf2c8631ed.png

这个压测程序接受两个参数,第一个是压测次数,第二个是map的大小。
可以看到,map比较小时,性能差异非常大;而map较大时,性能差异也有22%左右。

c01085dcacafe483a190c2c6c96a169c.png

三、最后

这个性能损耗有没有吓到你?

你平常写代码的时候,对于那些常量字符串,使用string了吗?

-EOF-

题图:来源自朋友圈。

a2a2dc3e3bb4b391ee7b7e220a8f92f0.png

上篇文章:学习 c++11 之各种小技巧

推荐:学习 c++11 之 右值引用

本文公众号:天空的代码世界

个人微信号:tiankonguse

微博:tiankongus

twitter:tiankonguse

微信群:微信拉你(算法闲聊群)

QQ算法群:165531769(比赛通知群)

知识星球:不止算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值