看了很多人的代碼,發現都沒注意到這個細節。
零、背景
最近在思考性能優化的事情。
說起性能優化,大家都知道能用引用的地方就不要使用指派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查找,那是不是就存在大量的隐式轉化帶來的性能損耗呢?
二、性能損耗
其實,關于這個問題我在四年前已經測試過了。
當時我對所有常用的文法全部進行了壓測。
今天,我再次運作了這個測試程式,性能差異之大依舊令我不敢置信。
壓測程式源碼我使用
c++11
重寫了,代碼如下,有三個函數。
charFun
是字元串查找壓測函數
stringFun
是string查找壓測函數
avgFun
這裡運作5輪求平均值。
這個壓測程式接受兩個參數,第一個是壓測次數,第二個是
map
的大小。
可以看到,
map
比較小時,性能差異非常大;而
map
較大時,性能差異也有
22%
左右。
三、最後
這個性能損耗有沒有吓到你?
你平常寫代碼的時候,對于那些常量字元串,使用
string
了嗎?
-EOF-
題圖:來源自朋友圈。
上篇文章:學習 c++11 之各種小技巧
推薦:學習 c++11 之 右值引用
本文公衆号:天空的代碼世界
個人微信号:tiankonguse
微網誌:tiankongus
twitter:tiankonguse
微信群:微信拉你(算法閑聊群)
QQ算法群:165531769(比賽通知群)
知識星球:不止算法