Go 性能优化技巧 3/10

内置 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 更快。



最新动态,请扫码关注

相关文章
相关标签/搜索