Go 高质量编程与性能调优 | 青训营笔记

61 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天

2023.01.17
第三天,青训营外又和同学搞了一个Java微服务项目,时间有点紧。

注释

代码是最好的注释。
注释必须提供上下文没有展示出的信息。

命名

好的命名就像一个好笑话。如果你必须解释它,那就不好笑了。 --Dave Cheney

流程:先处理错误

尽量保持正常代码路径为最小缩进,尽量不要加堆栈和循环等破坏简单逻辑的东西。
使用线性逻辑,处理逻辑尽量走直线,避免复杂的嵌套分支。

故障问题大多出现在复杂的条件语句和循环语句中

截屏2023-01-17 17.06.44.png

截屏2023-01-17 17.06.57.png

性能优化

slice、map预先估计空间大小可避免扩容,提升性能。

字符串

使用 strings.Builder
使用 +拼接性能最差,strings.Builder,bytes.Buffer 相近,strings.Buffer 更快

atomic包

锁的实现是通过操作系统来实现,属于系统调用。
atomic 操作是通过硬件实现,效率比锁高。
sync.Mutex 应该用来保护一段逻辑,不仅仅用于保护一个变量。
对于非数值操作,可以使用 atomic.Value,能承载一个 interface{}

性能优化小结

避免常见的性能陷阱可以保证大部分程序的性能普通应用代码,不要一味地追求程序的性能。
越高级的性能优化手段越容易出现问题。
在满足正确可靠、简洁清晰的质量要求的前提下提高程序性能。

pprof

flat 当前函数本身的执行耗时

flat% flat 占 CPU 总时间的比例

sum% 上面每一行的 flat% 总和

cum 指当前函数本身加上其调用函数的总耗时间

cum% cum 占 CPU 总时间的比例

Flat == Cum,函数中没有调用其他函数 Flat == 0, 函数中只有其他函数的调用

截屏2023-01-17 19.13.18.png 代码功能的正确性是性能优化的基础

总结

第三天结束,接着冲