Go 高质量编程与性能调优 | 青训营笔记

92 阅读4分钟

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可视化查看当前程序运行的资源消耗。如下图:

查看各个代码执行的性能

1.jpg

查看具体性能

2.jpg

以上方法虽然可以查看程序运行性能,但是可读性较差,我们在终端执行以下命令

go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10"

可以在命令行终端直观的观察程序各段代码对系统资源的消耗,结果如下:

3.jpg

此外,我们还可以使用top、list、web等其他命令对其程序性能进行可视化分析。

四、课后个人总结:

通过学习Go高质量编程与性能调优课程内容,了解到如何编写正确可靠、简洁清晰、无性能隐患的高质量代码,高质量的编程需要注意简单性、可读性和生产力。同时还了解到性能分析工具pprof的基本使用,pprof是用于可视化和分析性能分析数据的工具,可以知道应用在什么地方耗费了多少 CPU、memory 等运行指标。了解了性能调优的原则(要依靠数据不是猜测、要定位最大瓶颈而不是细枝末节、不要过早优化、不要过度优化)。最后,通过一个性能调优的案例巩固了此次的学习内容。通过对这次课程的学习,使我形成日常编写代码的过程中的调优意识,对代码的优化不可忽视。