高质量编程与性能调优实践 性能分析工具pprof

01 高质量编程

1.1 简介

什么是高质量

——编写的代码能够达到正确可靠、简洁清晰的目标可称之为高质量代码

• 各种边界条件是否考虑完备

• 异常情况处理,稳定性保证

• 易读易维护

编程原则

实际应用场景千变万化,各种语言的特性和语法各不相同

但是高质量编程遵循的原则是相通的

简单性

•消除“多余的复杂性”,以简单清晰的逻辑编写代码

•不理解的代码无法修复改进可读性

可读性

•代码是写给人看的,而不是机器

生产力

•编写可维护代码的第一步是确保代码可读生产力

•团队整体工作效率非常重要

--Go语言开发者DaveCheney

1.2 编码规范

如何编写 高质量 的Go代码

•代码格式•注释•命名规范•控制流程•错误和异常处理

1.2.1 编码规范—代码格式

1.2.2 编码规范—注释

Google的注释 规范

注释应该做的

•注释应该解释代码作用

•注释应该解释代码如何做的

•注释应该解释代码实现的原因

•注释应该解释代码什么情况会出错

Good code has lots of comments,bad code requires lots of comments

好的代码有很多注释,坏代码需要很多注释

——DaveThomasandAndrewHunt

公共符号始终要注释

1.2.3 命名规范

变量variable

•简洁胜于冗长

•缩略词全大写,但当其位于变量开头且不需要导出时,使用全小写

•例如使用ServeHTTP而不是ServeHttp

•使用XMLHTTPRequest或者xmlHTTPRequest

•变量距离其被使用的地方越远,则需要携带越多的上下文信息

•全局变量在其名字中需要更多的上下文信息,使得在不同地方可以轻易辨认出其含义

函数命名 function

包命名package

•只由小写字母组成。不包含大写字母和下划线等字符

简短并包含一定的上下文信息。例如schema、task等

不要与标准库同名。例如不要使用sync或者strings

以下规则尽量满足,以标准库包名为例

不使用常用变量名作为包名。例如使用bufio而不是buf

•使用单数而不是复数。例如使用encoding而不是encodings

谨慎地使用缩写。例如使用fmt在不破坏上下文的情况下比format更加简短

Good naming is like a good joke.If you have to explain it , it’s not funny

好的命名就像一个好笑话。如果你必须解释它,那就不好笑了 —DaveCheney

1.2.4 控制流程

下左 是上面代码的 规范格式;下右是 Go仓库中一段标准的处理流程

小结

•线性原理,处理逻辑尽量走直线,避免复杂的嵌套分支

•正常流程代码沿着屏幕向下移动

•提升代码可维护性和可读性

•故障问题大多出现在复杂的条件语句和循环语句

1.2.5 错误和异常处理

复杂错误

错误判定

panic

规范 例题

性能优化指南

1.3 性能优化建议

•性能优化的前提是满足正确可靠、简洁清晰等质量因素

•性能优化是综合评估,有时候时间效率和空间效率可能对立

•针对Go语言特性,介绍Go相关的性能优化建议

1.3 性能优化建议—Benchmark

b.N代表 实际测试了多少次

1.3.2 性能优化—Slice

预分配:初始化容量 ;能减少 底层 内存分配次数,减少执行时间

Slience底层:

容量不足时,底层数组会先扩容然后 再把b放进去

新切片仍然复用 原来切片 导致的陷阱:

1.3.3 性能优化—Map

1.3.4 性能优化—字符串处理

性能差异:

1.3.5 空间性能优化—空结构体

1.3.6 性能优化—atomic

atomic包 维护原子变量进行操作 性能优于 MutexAddOne()加锁操作;

1.3 建议小结

•避免常见的性能陷阱可以保证大部分程序的性能

•普通应用代码,不要一味地追求程序的性能

越高级的性能优化手段越容易出现问题

•在满足正确可靠、简洁清晰的质量要求的前提下提高程序性能

02性能调优实战

2.1简介

过早优化:功能会迭代或者用户数量没到性能瓶颈,过早就没用;

2.2 性能分析工具 pprof

•希望知道应用在什么地方耗费了多少CPU、Memory

•pprof是用于可视化和分析性能分析数据的工具

2.2.1 pprof 功能简介

2.2.2 pprof 实战排查

GitHub - wolfogre/go-pprof-practice: go pprof practice.

浏览器查看指标

http://localhost:6060/debug/pprof/

CPU 采集10s样本数据

web自动生成 调用关系图(每个节点 调用 消耗的数据和 调用链);

Heap—堆内存

可以把这个占用了1G的方法注释掉

注释之后 ;内存占用 降低

goroutine—协程

mutex—锁

block—阻塞

小结

2.2.3 pprof采样过程&原理

CPU

Heap—堆内存

Goroutine—协程&ThreadCreate—线程创建

Block& Mutex

2.3 性能调优案例

2.3.1 业务服务优化

>流程

•建立服务性能评估手段

•分析性能数据,定位性能瓶颈

•重点优化项改造

•优化效果验证

建立服务性能评估手段

分析性能数据,定位性能瓶颈

重点优化项改造

优化效果验证

2.3.2 基础库优化

2.3.3 Go语言本身优化

2.4 总结

非常感谢您阅读到这里,创作不易!如果这篇文章对您有帮助,希望能留下您的点赞👍 关注💖 收藏 💕评论💬感谢支持!!!

听说 三连能够给人 带来好运!更有可能年入百w,进入大厂,上岸

posted @ 2023-08-24 12:01  软工菜鸡  阅读(19)  评论(0编辑  收藏  举报  来源