高质量编程与性能优化|青训营笔记
这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
一.高质量编程
1.代码格式用gofmt格式化,使用goimports管理包和依赖。
2.注释解释函数的功能、实现、适用条件以及报错原因等,不重复注释。
3.命名时缩略词全大写,为开头时若不需要导出全小写。命名时信息要丰富但不重复。
4.流程尽量直线避免嵌套,先判断特殊情况和错误,主要功能放在判断以外
5.尽量使用error而不是panic以免程序崩溃
二.性能优建议
1.性能测试工具--benchmark
2.slice、map在make的时候先预分配大小
data := make([]int , 0, size)
data :=make(map[int]int ,size)
3.字符串多次拼接使用strings.Builder,bytes.Buffer也可,但不用+=
var builder :=strings.Builder
builder.WriteString(str)//增加
builder.String()//当前字符串
buf :=new(bytes.Buffer)
buf.WriteString(str)//增加
buf.String()//当前字符串
这两个底层都是用[]byte
实现的,因此也可以预先分配好大小
builder.Grow(len(str))
buf.Grow(len(str))
4.使用空结构体,空结构体不占用大小。比如:当我们使用map只需要其键以实现set功能而不需要使用值时可以在值处放空结构体。
m :=make(map[int]struct{})
5.使用atomic包,锁是通过系统实现而atomic包是通过硬件实现的,效率更高。Mutex应该用来保护一段逻辑而不仅仅是一个变量
三.性能优化——pprof
性能优化应该抓瓶颈分析主要矛盾,要依靠分析数据而不是猜测,不要过早、过度优化
pprof的使用
首先在程序中加入import "net/http/pprof"
,自动注册pprof
的 handler
到 http server
,然后在主函数中启动服务监听接口:
go func(){
if err:=http.ListenAndServer(":6060",nil);err!=nil{
log.fatal(err)
}
os.Exit(0)
}()
这时候浏览器打开“localhost:6060/debug/pprof”,可以进入主界面。其中每一个选项都可以看详细数据但是比较难分析。
1.CPU分析
在命令行中输入go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10"
,这个命令会进行CPU分析,采集时间为10秒,也可以调整。
采集完之后可以输入top
或topN
查看占用最多的或其中N条。
其中,flat表示这个函数占用CPU大小,cum表示这个函数及其调用的函数一共占用的CPU大小。
使用list
可以展示其中的代码细节,使用web
可以跳转到可视化网页。
2.Heap堆内存及其他的分析
使用go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/heap"
,会自动跳转至浏览器可视化界面,其中8080为端口号,若8080不可用可换成其他端口,heap为查看项目,类似的可改成goroutine(协程),mutex(锁),block(阻塞)。
要先安装Graphviz可视化组件,下载地址, 安装完成后将bin目录及bin下的dot.exe放到path路径下即可使用。
其中View可切换查看方式,分别有表格、调用图、火焰图,源码等方式。SAMPLE可切换数据样本,其中alloc_XXX表示累积申请的XXX,inuse_XXX表示当前在使用的XXX。
火焰图越长表示占用CPU时间越长
附练习项目地址