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

59 阅读4分钟

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

一、本堂课重点内容:

  • 高质量编程
  • 性能调优

二、详细知识点介绍:

编码规范

编写的代码能够正确可靠,并且简洁清晰才能称得上是高质量代码,这是两个对立矛盾的需求,有的人编写代码非常完善,但采用了复杂的结构,旁人无法读懂,有的太过于精简以致于功能有漏洞,各种边界条件考虑不充分,异常情况难以处理。

  • 正确性:是否考虑各种边界条件,错误的调用是否能够处理
  • 可靠性:异常情况或者错误的处理策略是否明确,依赖的服务出现异常是否能够处理
  • 简洁清晰:逻辑是否简单,后续调整功能或新增功能是否能够快速支持,其他人在阅读理解代码的时候是否能清楚明白,重构或者修改功能是否不会担心出现无法预料的问题

编程时需要始终记得简单性、可读性。能够采用简单语句实现的尽可能简单实现,采用适当的命名规则和合理的逻辑顺序保证他人也能够在一定时间内读懂。

  • gofmt工具

常见IDE自带的go语言格式化工具,有的在保存时会自动运行,非常方便。与其他的编程语言相同,go的代码格式、注释以及命名规范都有着严格要求,遵循一致的编码规范,在处理团队项目时才能流畅顺手。

有个很有趣的话,好的代码有很多注释,烂的代码需要很多注释。函数的注释应当描述函数其本身的功能和用途,如果函数名简单明了则可以省略,避免啰嗦。而对于复杂的函数,无法根据函数名判断功能的函数,必须要有注释进行适当的解释说明。

对于命名规范,尽可能要简洁,避免过长的变量名,特别是显而易见的缩写变量,应当使用全大写。

IDE常常会提醒需要增加异常抛出等操作,而对于正常的逻辑有可能是冗余的,这就需要更具实际情况判断是否有嵌套着的无效的语句,对于这些语句应当尽可能进行优化,提高代码的逻辑性和可读性。

  • 性能调优原则和建议

高性能代码为了效率会用到许多技巧,没有相关背景的人难以理解,不过有些基础性能问题是和语言本身相关的,对应的调整对可读性和可维护性影响不大。 在满足正确性、可靠性、健壮性、可读性等质量因素的前提下,设法提高程序的性能有时候时间效率和空间效率可能对立,此时应当分析哪个更重要,作出适当的折衷,例如多花费一些内存来提高性能。

  • 性能分析工具 pprof

三、实践练习例子:

  • Slice预分配内存

尽可能使用 make() 初始化切片时提供容量信息,特别是在追加切片时。

type slice struct{
    array unsafe.Pointer
    len int// 长度
    cap int// 容量
}

如果没有指定容量,那么可能会使得slice进行扩容操作,扩容操作会耗费额外时间,因此最好在初始化时指定好容量。

  • map预分配内存

无预分配内存的话也会导致go对map进行扩容操作,这些操作十分耗费时间,并且需要数次请求内存分配。提前分配好空间你可以减少内存拷贝和rehash消耗

// 无预分配内存
func NoPreAlloc(size int){
    data := make(map[int]int)
    for i:=0; i<size; i++{
        data[i]=1
    }
}

// 带预分配内存
func PreAlloc(size int) {
   data := make(map[int]int, size)
   for i := 0; i < size; i++ {
      data[i] = 1
   }
}

四、引用参考: