Go高质量编程与性能调优 | 青训营笔记
这是我参与「第五届青训营 」笔记创作活动的第3天
今天主要对Go高质量编程与性能调优进行学习。
一、本堂课重点内容:
本次课程讲了以下几个方面:
1.高质量编程
2.性能优化建议
二、详细知识点介绍:
1.高质量编程
高质量代码指的是代码能够达到正常可靠、简洁清晰的目标。
(1)编码规范
a.代码格式
在Go语言中官方提供了gofmt工具来统一开发者的代码风格,此外还有goimports工具用来自动增删和管理依赖包。
b.注释
注释的作用主要是用来解释1.代码的作用、2.代码如何实现的、3.代码实现的原因、4.代码出错的情况,好代码有很多注释,坏代码需要很多注释,代码就是最好的注释,注释应该提供代码未表达出的上下文信息。
c.命名规范
我们在编写程序代码的过程中,要注意对所使用的各种名称进行规范,名称要简洁、缩略词全大写、变量距离被使用的地方越远,携带越多的上下文信息。对命名进行规范的目的主要是为了降低阅读理解代码的成本。
d.控制流程
在编写流程控制的程序代码时,应该注意避免不必要的嵌套,减小缩进,优先处理错误/特殊情况,处理的逻辑尽量走直线,避免复杂的嵌套。
e.错误和异常处理
在Go语言中有错误类型error,我们可以errors.New()方法或者fmt.Errorf()方法创建一个错误类型的数据。同时,我们还可以使用errors.Is方法判断某个数据类型是否为错误类型。此外,在Go语言中还可以用panic抛出一个错误,但是不建议使用。针对异常处理,Go语言提供了defer+recover函数来捕获异常,具体如下:
func HandleError() error{
defer func(){
if err:=recover();err!=nil{
return err
}
//do something
return nil
}()
}
2.性能优化建议
性能调优主要是满足正确可靠、简洁清晰等因素,在Go语言中提供了benchmark工具来进行性能评估,具体使用如下:
go test -bench =. -benchmem
在编写程序代码时,为了确保程序的性能,一般建议会对切片slice和map定义时使用make方法进行初始化容量信息,如下:
s := make([]int, 0, 5) // 定义一个切片s并且为其初始化容量为5
m := make(map[int]int,10) // 定义一个map并且为其初始化容量为10
此外,针对字符串和空结构体,Go语言也有着相应的性能优化处理。
三、实践练习例子:
性能调优实战
针对Go语言的程序代码进行调优,我们可以首先使用性能分析工具pprof对程序代码进行分析,知道代码在什么地方消耗多少CPU资源和内存资源,使用pprof工具我们还可以可视化的分析其程序的性能。以下是使用pprof的一个代码案例:
package main
import (
"log"
"net/http"
_ "net/http/pprof"
"os"
"runtime"
"time"
"github.com/wolfogre/go-pprof-practice/animal"
)
func main() {
log.SetFlags(log.Lshortfile | log.LstdFlags)
log.SetOutput(os.Stdout)
runtime.GOMAXPROCS(1)
runtime.SetMutexProfileFraction(1)
runtime.SetBlockProfileRate(1)
go func() {
if err := http.ListenAndServe(":6060", nil); err != nil {
log.Fatal(err)
}
os.Exit(0)
}()
for {
for _, v := range animal.AllAnimals {
v.Live()
}
time.Sleep(time.Second)
}
}
运行上述代码,我们可以在浏览器中输入http://localhost:6060/debug/pprof可视化查看当前程序运行的资源消耗。如下图:
查看各个代码执行的性能
查看具体性能
以上方法虽然可以查看程序运行性能,但是可读性较差,我们在终端执行以下命令
go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10"
可以在命令行终端直观的观察程序各段代码对系统资源的消耗,结果如下:
此外,我们还可以使用top、list、web等其他命令对其程序性能进行可视化分析。
四、课后个人总结:
通过学习Go高质量编程与性能调优课程内容,了解到如何编写正确可靠、简洁清晰、无性能隐患的高质量代码,高质量的编程需要注意简单性、可读性和生产力。同时还了解到性能分析工具pprof的基本使用,pprof是用于可视化和分析性能分析数据的工具,可以知道应用在什么地方耗费了多少 CPU、memory 等运行指标。了解了性能调优的原则(要依靠数据不是猜测、要定位最大瓶颈而不是细枝末节、不要过早优化、不要过度优化)。最后,通过一个性能调优的案例巩固了此次的学习内容。通过对这次课程的学习,使我形成日常编写代码的过程中的调优意识,对代码的优化不可忽视。