天天看點

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(比賽通知群)

知識星球:不止算法