其他分享
首页 > 其他分享> > go 性能测试

go 性能测试

作者:互联网

go 性能测试

1.1 单元测试

单元测试主要是为了验证功能跟你的预期是否一致,简单来说就是验证你的函数能否正常运行及运行结果是否是你的预期

func TestStrCat(b *testing.T) {
	hello := "hello"
	golang := "golang"
	fmt.Printf("%s %s\n", hello, golang)
}

go test -v go_test.go -timeout=20m -count=1

1.1.1 单元测试案例

//必须是以 _test.go结尾,否则报错找不到测试文件
vim alex_test.go
func main() {

}
func TestBuffer(t *testing.T) {
	hello := "hello"
	goland := "goland"
	var buffer bytes.Buffer
	buffer.WriteString(hello)
	buffer.WriteString(",")
	buffer.WriteString(goland)
	fmt.Println(buffer.String()) //hello,goland
}


//在终端执行alex_test.go 这个单元测试中带Buffer的函数
go test  -v alex_test.go -run=Buffer 

2.1 基准测试

不关注结果是否正常,只关注运行消耗内存等,核心是压力测试

func BenchmarkStrCat(b *testing.B) {
    hello := "hello"
    golang := "golang"
    //下面的N是随机数,不可更改
    for i := 0; i < b.N; i++ {
        fmt.Printf("%s %s\n", 	hello, golang)
    }
}
go test -bench=StrCat -run=^$ -benchmem -benchtime=2s -cpuprofile=data/cpu.prof -memprofile=data/mem.prof
  -bench 正则指定运行哪些基准测试,如上表示包含StrCat 的函数
  -run 正则指定运行哪些单元测试
  -benchtime 表示运行时间,如果程序运行很快,那么规定时间内执行次数越多
  -benchmem 输出内存分配情况,这里
  -benchtime 每个函数运行多长时间

2.1.1 基准测试案例

vim alex_test.go
const LOOP int = 100

func BenchmarkStrCatWithOperator(b *testing.B) {
	hello := "hello"
	golang := "golang"
	b.ResetTimer() //重置计时器,避免上面的初始化工作带来的干扰
	for i := 0; i < b.N; i++ {
		var str string
		for i := 0; i < LOOP; i++ { //使用“+”连接很多字符串
			str += hello + "," + golang
		}
	}
}

func BenchmarkStrCatWithJoin(b *testing.B) {
	hello := "hello"
	golang := "golang"
	arr := make([]string, LOOP*2)
	for i := 0; i < LOOP; i++ {
		arr = append(arr, hello)
		arr = append(arr, golang)
	}
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		_ = strings.Join(arr, ",")
	}
}

func BenchmarkStrCatWithBuffer(b *testing.B) {
	hello := "hello"
	golang := "golang"
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		var buffer bytes.Buffer
		buffer.Grow(LOOP * 12) //如果能预估将来需要buffer的大小,则通过Grow()来指定,以获得最佳性能。这一行不是必须的
		for i := 0; i < LOOP; i++ {
			buffer.WriteString(hello)
			buffer.WriteString(",")
			buffer.WriteString(golang)
		}
		_ = buffer.String()
	}
}

//执行基准测试
go test -bench=StrCat -run=none -benchtime=2s -cpuprofile=./cpu.prof -memprofile=./mem.prof alex_test.go
  -bench=StrCat 执行带 StrCat函数的基准测试
  -run=none  不执行单元测试,等同于 ^$
  -benchtime=2s 基准测试时间两秒,速度越快的程序运行次数越多,对应N
  -cpuprofile=./cpu.prof 生成cpu的prof用于分析性能瓶颈
  -memprofile=./mem.prof 生成memory的prof用于分析性能瓶颈

goos: windows  //windows机器
goarch: amd64  //arm架构
cpu: AMD Ryzen 7 4800H with Radeon Graphics  //cpu信息
BenchmarkStrCatWithOperator-16 //16核          43244 //2秒运行43244次           55912 ns/op //每次运行耗时
BenchmarkStrCatWithJoin-16                250707              9516 ns/op
BenchmarkStrCatWithBuffer-16              397419              5336 ns/op
PASS
ok      command-line-arguments  9.120s

2.1.2 pprof的使用

上面我们在基准测试的时候生成了 cpu.prof和 mem.prof,这两个prof可以用于分析脚本的性能瓶颈

proof是可视化性能分析工具,提供以下功能:

监控CPU使用命令go tool pprof data/cpu.prof。进入交互界面后常用的命令有:


我们可以执行完 go tool pprof cpu.prof会进入交互页面,可以看到我们三个函数的cpu使用率排行,然后执行list func可以看出每行代码消耗多少资源,然后我们可以对耗时较多的部分进行代码优化,

我们上面输入exit从交互页面退出后,也可以把cpu.prof做成页面展示

go tool pprof -http=:8080 cpu.prof
//如果报错 Could not execute dot; may need to install graphviz
是需要我们在自己的机器上装graphviz
安装graphviz教程:  


3.1 测试代码规范

  单元测试和基准测试必须放在以_test.go为后缀的文件里。
  单元测试函数以Test开头,基准测试函数以Benchmark开头。
  单元测试以*testing.T为参数,函数无返回值。
  基准测试以*testing.B为参数,函数无返回值。

标签:buffer,性能,golang,test,测试,go,prof,hello
来源: https://www.cnblogs.com/liwenchao1995/p/16328785.html