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

66 阅读3分钟

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

1 高质量编程

核心目标:正确可靠、简洁清晰

保证稳定可靠的同时,使代码易读易懂,写可维护的代码

1.1 注释

正如课上所举的例子,我们在阅读很久以前写的代码的时候常常会看不懂,甚至怀疑这是不是自己写的。阅读同事的代码时,如果没有明了的注释,就往往因为难以理解需要不断询问,甚至产生错误。如果平时写代码时加上一些注释,就可以比较容易地理解,也方便同事或者其他人阅读和维护。

注释需要解释代码的作用、实现过程、原因和出错误的情况

  • 解释代码作用:适合解释公共符号,如对外提供的函数解释其作用;当然,如果函数名一目了然则不需要赘述,因此,命名时也要注意避免产生歧义。
  • 解释实现过程:函数内部的实现方法有时可能十分复杂,可能在阅读上造成困难或者产生误解;所以需要给内部实现比较复杂的函数加上注释。
  • 解释代码实现的原因:可以补充一下方法之外的上下文,方便理解。之前实习时发现同一个功能有许多实现的函数,如果不加注释则不便理解其背景。后来阅读注释后了解到这是针对不同场景和入口,所以实现了多个方法。
  • 解释代码什么情况会出错:可以描述限制条件、隐患等,来提醒使用者,避免踩坑,可以避免很多不必要的损失。

总而言之,加适当的注释可以方便阅读,提高效率;但同时也要注意,代码是最好的注释,如果代码本身简洁清晰,也不会对阅读造成太大困难。

1.2 命名规范

命名时尽量简洁,注意大小写,同时需要携带上下文信息,起有意义的名

func (c *Client) send(req *Request, deadline time.Time)
func (c *Client) send(req *Request, t time.Time)

这里命名deadline是有含义的,所以好过命名为t

同时,也尽量避免冗余,如time包的time.Now( )就好过time.NowTime( )

1.3 尽量保持正常代码路径为最小缩进

优先处理错误和特殊情况,减少嵌套,方便阅读

2 性能调优

  • Slice 预分配内存:在定义Slice的时候尽量提供容量信息,这样在追加切片的时候可以极大提高效率。避免重新开辟一块内存
  • 用copy代替re-slice:用re-slice截取部分可能会导致整个底层数组得不到释放,尤其是原切片占用很大内存时,会影响效率。
  • Map 预分配内存:类似Slice,在追加元素时可以减少扩容的影响

总结

通过这次课了解了许多规范编程的相关知识,也尝试使用pprof进行了性能调优实战,尤其是最小缩进这一原则,之前没有很注意过,感觉十分受用