这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
重点内容概述
- 高性能编程意义和实践
- 性能调优的典型tips与项目实践
详细介绍
高质量编程
一个代码应该要:
- 简单清晰
- 可读
- 生产力(团队整体工作效率非常重要)
讲解了以下的部分:
- 代码格式化
- 自带工具
- 注释
- 代码是最好的注释,注释应该提供代码为表达出的上下文信息
- 应该:
-
解释作用
- 一个例子
- 一个例子
-
解释如何做的
-
解释代码实现的原因
-
解释什么时候出错
-
- 命名规范
- 简洁,降低理解成本
- 变量
- 缩略词前大写,位于变量开头且不需要导出全小写(ServeHTTP, xmlHTTPRequest)
- 声明离被使用的地方越远,越应该涵盖多的 content(以防忘了作用 xx)
- 函数
- 函数名不携带包名的上下文信息,因为包名和函数名总是成对出现的
- 函数名尽量简短当名为 foo 的包某个函数返回类型 Foo 时,可以省略类型信息而不导致歧义
- 当名为 fo0 的包某个函数返回类型 T 时 (T 并不是 F0o), 可以在函数名中加入类型信息
- 包
- 只小写字母;简洁但包含 content;注意避开标准库
- 不适用常用变量名;使用单数不是用复数,;谨慎用缩写等等
- 控制流程
- 线性原理,避免嵌套
- 比如没有意义的 else
- 优先处理 特殊情况/错误情况,尽早返回、减轻流程
- 线性原理,避免嵌套
- 错误和异常处理
性能调优
建议
参考
benchmark - 上节课提到过,go 自带基准性能测试的工具
小 tips
- 在 slice 初始化的时候就提供 size
- 一是容量不够要先扩容再放入,耗时
- 二是新切片会复用原来的底层数组,一直得不到释放;建议 copy 而不是直接在切片上切片
- map 也同样预分配内存
- 添加元素会触发扩容
- 减少内存拷贝和 rehash 消耗
- 使用
stings.Builder来拼接字符串- 和
bytes.Buffer一样,底层是[]byte 数组,不需要每次拼接重新分配内存
- 和
- 使用空结构体占位
- 它不占空间
- 它不占空间
- 使用 atomic 包
性能优化分析工具:pprof
原则
- 依靠数据而不是猜测
- 定位最大瓶颈而不是细枝末节
- 不要过早优化
- 不要过度优化
ppof 用在什么地方
- 希望应用在什么地方耗费了多少 CPU 和内存
- 简单可视化和性能分析
- 反正功能很多,项目会带大家具体用一下
实践自己看吧!!或者参看这里!
课后个人总结
这节课也很有用!这一类只是太琐碎了……通过自学博文难以学习,老师很好地帮忙总结了
依靠项目讲解的方式也很喜欢