这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记
今天这节课跟前两节不一样,今天的课更加的高屋建瓴,老师站在系统架构的维度来介绍如何进行测试和优化,如何编写出高质量的代码
高质量编程
- 编码规范 原则 : 简单性 可读性 生产力 为准绳
- 代码的格式
- 如何编写注释 (解析代码的作用,怎么做的)
- 变量和函数命名的选择 (简洁明了 变量距离其被使用的地方越远,则需要携带越多的上下文信息 <- 以前见到很长的命名不是很理解,原来有理论经验在这里)
- 控制流程的选择 (避免嵌套"元气弹")
if ok:= dosomething();ok{
.....
}
if err:= dosomething();err != nil{
.....
}
- 错误以及异常的处理 (error & panic)
性能优化
过早的优化是万恶之源
1.Benchmark基准测试 go test -bench=. -benchmem
2.切片,map预分配内存
尽可能在使用make()初始化切片时提供容量大小信息
一个很大的底层数组由于上层的一小片引用,导致底层数组无法被释放,此时应该使用copy函数
3.字符串拼接
字符串是不可变类型,每次拼接都会带来大量的内存移动开销
最好的方案 "strings.Builder"
4.空结构体struct{}的妙用
空结构体的实例不占用内存空间,但其语义强,可作为占位符
场景如下: 实现Set,可以考虑用map来代替,对于这个场景,只需要用到map的键,而不需要值
set开源实现:https//github.com/deckarep/golang-set/blob/main/threadunsafe.go
5.并发场景下的计数器counter 考虑使用atomic包里的方法,其由底层硬件直接提供支持,因此性能要高很多,而锁lock是在操作系统级别实现的,性能要差一些,并且应该用锁来锁住一片代码逻辑,而不单单是一个变量,因此atomic非常适合。
性能调优
用数据说话
理论
pprof工具可以根据采样信息来观测CPU,Heap,Goroutine,Mutex,Block,ThreadCreat的信息,并且也可以将采样信息以web形式展现出来。