这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
2023.01.17
第三天,青训营外又和同学搞了一个Java微服务项目,时间有点紧。
注释
代码是最好的注释。
注释必须提供上下文没有展示出的信息。
命名
好的命名就像一个好笑话。如果你必须解释它,那就不好笑了。 --Dave Cheney
流程:先处理错误
尽量保持正常代码路径为最小缩进,尽量不要加堆栈和循环等破坏简单逻辑的东西。
使用线性逻辑,处理逻辑尽量走直线,避免复杂的嵌套分支。
故障问题大多出现在复杂的条件语句和循环语句中
性能优化
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, 函数中只有其他函数的调用
代码功能的正确性是性能优化的基础
总结
第三天结束,接着冲