这是我参与「第五届青训营」笔记创作活动的第7天,今天我将总结一下Go语言中性能优化的相关内容与概念,主要从单元测试、基准测试等几方面来进行总结。
单元测试
单元测试,是指对软件中的最小可测试单元进行检查和验证,是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。
在Go语言中,单元测试文件有以下特点:
- 单元测试文件:所有文件以_test.go结尾
- 单元测试函数:一般写为func TestXxx(testing.T)形式
- TestMain:初始化逻辑放在TestMain中
执行语句
单元测试可以通过以下语句进行:
go test x_test.go x.go
单元测试的覆盖率
意义
单元测试的覆盖率代表测试代码覆盖(执行)了原始代码的百分比。
单元测试的覆盖率可以通过如下语句进行计算:
go test x_test.go x.go --cover //直接运行测试并进行覆盖率计算
在开发中一般单元测试覆盖率需要达到:50%~60%,要求较高,覆盖率可以达到80%+
单元测试相关软件包
可以使用monkey包:github.com/bouk/monkey
作用:使测试再不依赖本地文件
基准测试
基准测试是指通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量的和可对比的测试。
与单元测试类似,基准测试函数一般写为func BenchmarkXxx(testing.T)形式,相关语句:
执行基准测试命令:go test -bench=. -benchmem
性能分析工具pprof
使用方式:
import ("net/http"
_ "net/http/pprof"
)
func main(){
go func() { //添加在main函数中
if err := http.ListenAndServe(":6060", nil); err != nil {
log.Fatal(err)
}
os.Exit(0)
}()
}
CPU相关命令
-
采样
go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10" -
查看资源占用
top -
排查问题查找
list [正则表达式] //根据指定的正则表达式查找命令行 -
可视化网页
使用可视化网页进行观察
web
其他性能分析相关命令
//堆内存
go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/heap"
//协程
go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/goroutine"
//锁
go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/mutex"
//阻塞
go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/block"
参考网页
当然在现在纸上谈兵还是没有什么实际作用,后续进行测试的时候会再进行进一步的学习,其实现在包括基准测试的一些命令与用法现在也不是特别清楚,后续会继续推进,其实项目推进学习是一个很好的方法,也希望这次的大项目做完以后能收获一个好的成绩。