Go性能优化 | 青训营笔记

64 阅读2分钟

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

一.重点知识

编码规范、性能优化、优化工具等

二.编码规范

变量:缩略词全大写(如ServerHTTP),但当其位于变量开头且不导出时使用全小写;使用地方较远时携带上下文信息

函数:由于函数和包同时出现,函数不必携带包的信息;同时因函数返回值类型不同,可在需要时加入返回值信息

:不能与标准库相同;不能使用常用变量名;只由小写字母组成且不包含下划线;需要携带一定上下文信息等

异常处理:使用errors.New创建匿名变量来表示简单错误;可以使用嵌套方法来追踪错误,在错误链上追踪特定错误,使用errors.As;panic用于真正异常的状况;recover在当前goroutine的被defer函数中生效下

三.性能优化

benchmark

go提供了支持基准性能测试的benchmark工具,使用命令go test -bench=. -benchmem

结果:

goos: darwin
goarch: arm64
pkg: github.com/RaymondCode/go-practice/start
BenchmarkFib10-8 //表示函数名,8为GOMAXPROCS值 
1855870 //b.N的值,表示一共执行多少次
602.5 ns/op //每次执行花费602.5ns
0 B/op //每次执行申请多少内存
0 allocs/op //每次执行申请几次内存

slice优化

1.在创建slice时使用make预分配内存,减少扩容次数

2.在已有的slice基础上创建slice,不会创建新的底层数组,可能引发大内存不能释放的情况,可使用copy代替re-slice

map优化

1.同slice优化一样,预分配内存,减少拷贝和rehash的次数

字符串处理

1.使用strings.Builder拼接字符串,如

var builder strings.Builder
for i:=0 i<n i++ {
    builder.WriteString(str) //相当于builder += str
}

2.可使用bytes.Buffer

使用bytes.Buffer读取数据,可进行string类型操作,但性能较strings.Builder弱

空结构体

空结构体实例 struct{} 不占据任何内存,可作为各种场景下的占位符使用,如初始化等

atomic包

golang中实现非侵入式的原子性操作,调用sync/atomic中的几个函数可以对几种简单的类型进行原子操作,这些类型包括int32,int64,uint32,uint64,uintptr,unsafe.Pointer,共6个。这些函数的原子操作共有5种:增或减,比较并交换、载入、存储和交换

调优工具pprof

关于pprof工具还没有真正使用研究过,这里先贴一下功能简介⑧

image.png

四.个人总结

go语言性能调优的部分技巧与C++十分类似,这些技巧可以互相通用