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

54 阅读2分钟

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

一、本堂课重点内容:

  • 何为高质量?

  • 高质量编程规范

    • 代码格式
    • 注释
    • 命名规范
    • 控制流程
    • 错误和异常处理
  • 性能优化建议

    • Go自带性能测试工具Benchmark
    • Slice
    • 字符串处理

二、详细知识点介绍:

  • Slice :

    • 预分配内存 : 在使用make初始化切片时就提供容量信息。若在程序运行过程中对切片进行扩容,扩容过程中拷贝会导致程序运行变慢。
    • 大内存释放 : 在原切片(大量数据)上切片(少量数据),虽然只使用了一小段数据,但底层仍占用着大量空间,使用copy代替切片。
  • 字符串处理 : 处理字符串时要善用strings.Builderbytes.Buffer

  • Atomic包 : 多线程共用计算器时,Atomic会比GO自带的锁更快。

三、实践练习例子:

  • Slice 预分配内存
  1. 未预分配内存
 func NoPreAlloc(size int) {
     data := make([]int, 0)
     for k := 0; k < size; k++ {
         data = append(data, k)
     }
 }
  1. 预分配内存
 func PreAlloc(size int) {
     data := make([]int, 0, size)
     for k := 0; k < size; k++ {
         data = append(data, k)
     }
 }
  • 大内存释放
 // GetLastBySlice 通过切片返回,未释放origin占用的内存
 func GetLastBySlice(origin []int) []int {
     return origin[len(origin)-2:]
 }
 ​
 // GetLastByCopy 通过copy返回,origin占用的内存若无引用则会被释放
 func GetLastByCopy(origin []int) []int {
     result := make([]int, 2)
     copy(result, origin[len(origin)-2:])
     return result
 }

四、课后个人总结:

  • 在编写代码过程中要注意代码编写规范,例如包名中包含的信息,在方法名中就没有必要去二次说明。
  • 要去从底层考虑代码,如在初始化切片时去提供容量信息,进行预分配内存。
  • 字符串处理时,要学会使用strings.Builderbytes.Buffer
  • 在遇到错误时,慎用panic,除非发生了不可逆转的错误。