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

62 阅读3分钟

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

老师的项目地址

重点内容概述

  • 高性能编程意义和实践
  • 性能调优的典型tips与项目实践

详细介绍

高质量编程

一个代码应该要:

  • 简单清晰
  • 可读
  • 生产力(团队整体工作效率非常重要)

讲解了以下的部分:

  • 代码格式化
    • 自带工具
  • 注释
    • 代码是最好的注释,注释应该提供代码为表达出的上下文信息
    • 应该:
      • 解释作用

        • 一个例子 image.png
      • 解释如何做的

      • 解释代码实现的原因

      • 解释什么时候出错

  • 命名规范
    • 简洁,降低理解成本
    • 变量
      • 缩略词前大写,位于变量开头且不需要导出全小写(ServeHTTP, xmlHTTPRequest)
      • 声明离被使用的地方越远,越应该涵盖多的 content(以防忘了作用 xx)
    • 函数
      • 函数名不携带包名的上下文信息,因为包名和函数名总是成对出现的
      • 函数名尽量简短当名为 foo 的包某个函数返回类型 Foo 时,可以省略类型信息而不导致歧义
      • 当名为 fo0 的包某个函数返回类型 T 时 (T 并不是 F0o), 可以在函数名中加入类型信息
      • 只小写字母;简洁但包含 content;注意避开标准库
      • 不适用常用变量名;使用单数不是用复数,;谨慎用缩写等等
  • 控制流程
    • 线性原理,避免嵌套
      • 比如没有意义的 else
    • 优先处理 特殊情况/错误情况,尽早返回、减轻流程
  • 错误和异常处理

性能调优

建议

参考

benchmark - 上节课提到过,go 自带基准性能测试的工具

image.png

小 tips

  • 在 slice 初始化的时候就提供 size
    • 一是容量不够要先扩容再放入,耗时
    • 二是新切片会复用原来的底层数组,一直得不到释放;建议 copy 而不是直接在切片上切片
  • map 也同样预分配内存
    • 添加元素会触发扩容
    • 减少内存拷贝和 rehash 消耗
  • 使用 stings.Builder 来拼接字符串 image.png
    • bytes.Buffer 一样,底层是[]byte 数组,不需要每次拼接重新分配内存
  • 使用空结构体占位
    • 它不占空间 image.png
  • 使用 atomic 包

性能优化分析工具:pprof

原则

  • 依靠数据而不是猜测
  • 定位最大瓶颈而不是细枝末节
  • 不要过早优化
  • 不要过度优化

ppof 用在什么地方

  • 希望应用在什么地方耗费了多少 CPU 和内存
  • 简单可视化和性能分析
  • 反正功能很多,项目会带大家具体用一下

实践自己看吧!!或者参看这里

课后个人总结

这节课也很有用!这一类只是太琐碎了……通过自学博文难以学习,老师很好地帮忙总结了

依靠项目讲解的方式也很喜欢