高质量编程 | 青训营笔记

49 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天 一、本堂课重点内容:

  • 编码规范
  • 性能优化
  • 性能分析
  • 性能案例

二、详细知识点介绍:

  • 尽量以简单易懂的方式编写代码,保证代码可读,方便团队间CR以及修复改进
  • 注释问题,公共符号始终要注释,变量常量函数与结构等。注释需要做的有代码作用,代码如何做,代码实现的原因以及出错情况;代码是最好的注释,注释应该提高代码未表达出的上下文信息。
  • 代码格式使用gofmt以及goimports
  • 命名规范变量名在函数参数时要说明用意,内部一些变量可简化,函数名应尽量简短;包命名只由小写字母组成。
  • 不建议在业务代码中使用panic,应尽量使用error。可以在程序启动例如init或main中使用panic,避免发生不可逆转的错误。
  • recover只能在被defer的函数中使用,只在当前goroutine生效,后进先出

三、实践练习例子:

  • go 性能优化
  1. 性能测试
go test -bench. -benchmem
  1. slice,map初始时预分配内存;字符串拼接使用WriteString。bytes.Buffer转化未字符串时重新申请了一块空间。Strings》builder直接将底层的[]byte转换成了字符串类型返回
buf := new(bytes.Buffer)
buf.Grow(n * len(str))
buf.WriteString(str)
return buf.String()
  1. 大内存未释放,原切片过大,新建小切片仍引用原有底层数据,会导致内存无法释放,可以使用copy
  2. 空结构体可以节省内存,作为占位符,用map使用set
m := make(map[int]struct{})
  1. atomic包,锁的实现是通过操作系统来实现,atomic操作是通过硬件实现。对于锁而言,应该是保护一段逻辑,atomic更多的用来保护一个变量
  • 性能调优原则
  1. 要定位最大瓶颈而不是细枝末节
  2. 不要过早过度优化
  3. 性能分析工具pprof
go tool pprof -http=:8080 "heep://localhost:6060/debug/pprof/mutex"
  • 性能分析工具原理

QQ图片20230119163107.png

  1. 业务服务优化流程:1)建立服务性能评估手段:单独benchmark无法满足复杂逻辑分析,请求流量构造,单机器压测和集群压测,单机性能数据和集群性能数据;2)分析性能数据,定位性能瓶颈,高峰低峰性能分析;3)重点优化项改造,新旧逻辑接口数据diff;4)优化效果验证:重复压测,上线评估优化效果