內置 map 類型是必須的。首先,該類型使用頻率很高;其次,可藉助 runtime 實現深層次優化(好比說字符串轉換,以及 GC 掃描等)。可儘管如此,也不意味着萬事大吉,依舊有不少需特別注意的地方。函數
1. 預設容量 性能
map 會按需擴張,但須付出數據拷貝和從新哈希成本。若有可能,應儘量預設足夠容量空間,避免此類行爲發生。優化
從結果看,預設容量的 map 顯然性能更好,更極大減小了堆內存分配次數。spa
2. 直接存儲 指針
對於小對象,直接將數據交由 map 保存,遠比用指針高效。這不但減小了堆內存分配,關鍵還在於垃圾回收器不會掃描非指針類型 key/value 對象。對象
寫個示例對比一下,注意調整 33 行的函數調用。內存
指針模式:字符串
值模式:
string
從兩次輸出裏 GC 所佔時間百分比,就可看出 「巨大」 差別。容器
提示:map 對 key、value 數據存儲長度有限制。
3. 空間收縮
很遺憾,map 不會收縮 「再也不使用」 的空間。就算把全部鍵值刪除,它依然保留內存空間以待後用。
就算清空了全部數據,空間依舊沒有釋放。解決方法是取消 23 行註釋,或者替換爲一個新的 map 對象。
提示:如長期使用 map 對象(好比用做 cache 容器),偶爾換成 「新的」 或許會更好。還有,int key 要比 string key 更快。
最新動態,請掃碼關注