Go 性能优化技巧 3/10

内置 map 类型是必须的。首先,该类型使用频率很高;其次,可借助 runtime 实现深层次优化(好比说字符串转换,以及 GC 扫描等)。可尽管如此,也不意味着万事大吉,依旧有不少需特别注意的地方。函数

一、预设容量

map 会按需扩张,但须付出数据拷贝和从新哈希成本。若有可能,应尽量预设足够容量空间,避免此类行为发生。性能

预设容量 结果

从结果看,预设容量的 map 显然性能更好,更极大减小了堆内存分配次数。优化

二、直接存储

对于小对象,直接将数据交由 map 保存,远比用指针高效。这不但减小了堆内存分配,关键还在于垃圾回收器不会扫描非指针类型 key/value 对象。spa

写个示例对比一下,注意调整 33 行的函数调用。指针

直接存储

指针模式:对象

指针模式

值模式:内存

从两次输出里 GC 所占时间百分比,就可看出 “巨大” 差别。字符串

内置 map 类型是必须的。首先,该类型使用频率很高;其次 noticestring

三、空间收缩

很遗憾,map 不会收缩 “再也不使用” 的空间。就算把全部键值删除,它依然保留内存空间以待后用。容器

空间收缩 result1

就算清空了全部数据,空间依旧没有释放。解决方法是取消 23 行注释,或者替换为一个新的 map 对象。

result2

提示:如长期使用 map 对象(好比用做 cache 容器),偶尔换成 “新的” 或许会更好。还有,int key 要比 string key 更快。

相关文章
相关标签/搜索