Go性能优化|青训营笔记

37 阅读2分钟

这是我参与【第五届青训营】伴学笔记创作活动的第3天,今天主要了解高质量编程与性能调优实战。

高质量编程

代码正确可靠、简洁清晰。

编程原则

  • 简单性:以简单清晰的逻辑编写代码

  • 可读性:编写可维护代码的第一步是确保可读性

  • 生产力:团队整体工作效率非常重要

编码规范

  • 代码格式:推荐使用gofmt(Go语言官方提供的统一风格的工具)自动格式化代码。

  • 注释:公共函数要注释,以及注释应该解释代码作用,如何做的,实现原因,出错情况

  • 命名规范:缩略词全大写,但是在变量开头且不用导出时,使用全小写;变量距离其被使用的地方越远,则需要携带的上下文越多

//Bad
for index:=0;index<len(s);index++{
}
//Good
for l := 0;l<len(s);l++{
}
//此处l和index作用相同,所有应该以简便为主要标准
  • 控制流程

    • 避免嵌套,保持正常流程清晰
    • 尽量保持正常代码路径为最小缩进
    • 提升代码可维护性和可读性
  • 错误和异常处理

    • 仅出现一次的错误优先使用errors.New来创建匿名变量来表示
    • 错误的Wrap实际上是提供一个error嵌套另一个error
    • 判断一个错误是否为特定错误使用error.Is,在错误链上获取特定种类错误,使用error.As
    • panic用于真正异常的情况
    • recover生效范围,在当前goroutine的被defer的函数中生效

性能优化

性能优化建议:Benchmark(Go语言提供的支持基准性能测试工具)

func BenchmarkFib10(b *testing.B){
    for n:=0;n<b.N;n++{
        Fib(10)   //函数
    }
}

结果中会显示每次执行花费时间,申请多大内存,申请几次内存等

性能优化建议:Slice,尽可能在使用make()初始化切片时提供容量信息

image.png

缺点:大内存得不到释放,可以用copy替代re-slice

性能优化建议:map(提前预估好需要的空间)

性能优化建议:字符串处理

使用strings.Builder

func ByteBuffer(n int ,str string)string{
    buf:=bew(bytes.Buffer)
    for i:=0;i<n;i++{
        buf.WriteString(str)
    }
    return buf.String()
}

性能优化建议:空结构体(节省内存)

性能优化建议:atomic包(硬件实现)

性能分析工具:pprof(用于可视化和分析性能分析数据),后面均实战内容,可以跟文档动手操作一遍最好。