天天看点

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查找,那是不是就存在大量的隐式转化带来的性能损耗呢?

二、性能损耗

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

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

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

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

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

压测程序源码我使用

c++11

重写了,代码如下,有三个函数。

charFun

是字符串查找压测函数

stringFun

是string查找压测函数

avgFun

这里运行5轮求平均值。

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

这个压测程序接受两个参数,第一个是压测次数,第二个是

map

的大小。

可以看到,

map

比较小时,性能差异非常大;而

map

较大时,性能差异也有

22%

左右。

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

三、最后

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

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

string

了吗?

-EOF-

题图:来源自朋友圈。

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

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

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

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

个人微信号:tiankonguse

微博:tiankongus

twitter:tiankonguse

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

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

知识星球:不止算法