“这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天”
1.3 性能优化
- 性能优化是综合评估,时间效率和空间效率可能对立;
1.3.1 Benchmark
Go语言提供了支持基准性能测试的benchmark工具;
benchmem表示统计内存信息;
1.3.2 slice
- slice 预分配内存,动态数组(存在动态扩容机制)
- slice本质是一个数组片段的描述;
- slice切片,不会释放大内存;不如copy
1.3.3 map
map预分配内存
1 )不断向map中添加元素的操作会触发map扩容;
2 )提前分配好空间可以减少内存拷贝和rehash的消耗;
3 )建议提前根据实际需求预估好需要的空间;
1.3.4 字符串处理
- 使用strings.Builder进行字符串拼接,效率更高;
字符串在go语言中是不可变类型,占用内存大小是固定的;
每次+都会重新分配内存;
- string.Builder和bytes.Buffer底层都是[]byte数组;
1.3.5 空结构体
空结构体本身具有很强的语义,不需要任何值,仅作为占位符;
空结构体是节省内存空间的一个手段;
1.3.6 atomic包
- 变量自带锁,
- 小结
- 1 )避免常见的性育陷阱可以保证大部分程序的性能;
- 2 )普通应用代码,不要一味地追求程序的性能;
- 3 )越高级的性能优化手段越容易出现问题;
- 4 )在满足正确可靠、简洁清晰的质量要求的前提下提高程序性能;