这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天。
高质量编程性能优化建议
1、性能优化建议:
在大规模程序部署的场景,仅支持正常功能是不够的你还需要尽可能的提升性能,性能优化的前提是满足正确可靠,简洁清晰等质量因素,性能优化是综合评估时间效率和空间效率。
(1)Go语言中提供了支持基准性能测试的benchmark工具,例如统计内存信息:
go test -bench=.-benchmem
(2)使用slice的时候尽可能在使用make()初始化切片时提供容量信息(预分配)在原有切片的基础上创建切片,不会创建新的底层数组,使用copy替代re-slice。
(3)使用map的时候同样尽可能预分配空间。预分配空间可以减少内存拷贝和Rehash的消耗。
(4)字符串拼接使用strings.Bulider而不是加号。
(5)字符串拼接的时候使用加号拼接性能最差,strings.Bulider,bytes.Buffer相近,strings.Buffer更快。字符串在Go语言中是不可变类型,占用内存大小是固定的,使用加号每次会重新分配内存。strings.Bulider,bytes.Buffer底层是byte数组不需要每次拼接重新分配内存。
(6)可以使用空结构体节省内存,空结构体struct{}实例不占用任何的内存空间,可以当作占位符使用。
(7)多线程的时候使用atomic包,atomic操作通过硬件实现,效率比锁高,对于非数值操作,可以使用atomic.Value能承载一个interface{},sync.Mutex应该用来保护一段逻辑,不仅仅用于保护一个变量。
(8)在满足正确可靠、简洁清晰的质量要求的前提下提高程序性能。
2、性能优化原则:
(1)依靠数据
(2)定位最大瓶颈而非细节
(3)勿过早优化,勿过度优化
3、性能分析工具:
pprof是用于可视化和分析性能分析数据的工具。可以使用go get进行获取和安装。
总结
本文是青训营学习中关于Go语言中性能优化的笔记,同时认识到性能优化的重要性