ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

go 性能测试

2022-05-30 23:32:38  阅读:142  来源: 互联网

标签:buffer 性能 golang test 测试 go prof hello


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

  • -v 打印详情测试信息
  • -timeout 默认10分钟超时
  • -count 函数运行几次

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 Profiling:按一定频率采集CPU使用情况。
  • Memory Profiling:监控内存使用情况,检查内存泄漏。
  • Goroutine Profiling:对正在运行的Goroutine进行堆栈跟踪和分析,检查协程泄漏。

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

  • topn:列出最耗计算资源的前n个函数
  • list func:列出某函数里每一行代码消耗多少计算资源
  • peek func:列出某函数里最耗计算资源的前几个子函数


我们可以执行完 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有