这是我参与「第五届青训营」伴学笔记创作活动的的第4天。
今天主要学习了go的编码规范以及一些可调优的方面,也学习了一些性能优化的分析工具,最后学习了一个实际的调优案例来深刻理解。
编码规范
和其他语言类似,都是尽可能要去保证方便维护以及容易读,最好一个团队需要统一一下开发的规范。 对于公共的函数或者值都需要对其编写注释,告诉别人这个变量或者函数的意义。此外代码格式的规范可以使用golang官方提供的gofmt、goimports工具来进行格式化。
同时老师也介绍了一些命名和缩进的规范建议,包括函数,变量以及包命名的规范。最后介绍了一些常见的异常处理规范,比如error尽可能提供简洁的上下文信息,方便出现的时候能够比较快速地进行定位,panic用于真正出现异常的情况,以及recover只在goroutine中生效。不过感觉不如Java的全局异常捕获,这样的处理方法更好一些。
性能优化
go语言提供了基准测试的工具benchmark,可以测试一些函数的基本信息,比如每次执行平均花费的时间,以及每次申请的内存大小、申请了多少次内存。下面有几个性能优化的建议:
- slice尽可能预分配内存
- 用copy去代替re-slice,由于创建新的slice不会申请新的空间,而是在原有的切片上进行创建,所以如果一个已经申请了很大内存的slice,通过re-slice的方法获得另一个slice,会导致原先的内存没有释放掉
- 预分配map内存
- 字符串处理尽量用string.Builder,不用
+,不知道go编译器会不会帮忙优化,Java是会的 - 可以通过空的结构体来节省空间
- 尽量少用锁,可以用atomic包下的一些类
性能优化实战
通过pprof性能分析工具来进行排查实战