Go的基准测试

Go的提供了方便的Benchmark基准测试工具,有效的测试方法的性能

基准测试是测量一个程序在固定工作负载下的性能

在Golang中,基准测试函数以Benchmark为前缀并且带有一个 *testing.B 类型的参数

基准测试主要是通过测试CPU和内存的效率问题,来评估被测试代码的性能,进而找到更好的解决方案。

  • 基准测试的代码文件必须以_test.go结尾
  • 基准测试的函数必须以Benchmark开头,必须是可导出的
  • 基准测试函数必须接受一个指向Benchmark类型的指针作为唯一参数
  • 基准测试函数不能有返回值
  • b.ResetTimer是重置计时器,这样可以避免for循环之前的初始化代码的干扰
  • 最后的for循环很重要,被测试的代码要放到循环里
  • b.N是基准测试框架提供的,表示循环的次数,因为需要反复调用测试的代码,才可以评估性能
  1. 参数-bench,它指明要测试的函数;点字符意思是测试当前所有以Benchmark为前缀函数
  2. 参数-benchmem,性能测试的时候显示测试函数的内存分配大小,内存分配次数的统计信息
  3. 参数-count n,运行测试和性能多少此,默认一次

基准测试: 基准测试就是在一定的工作负载之下检测程序性能的一种方法

go test -bench=. -benchmem 不指定参数,就是当前目录运行所有测试文件

go test -bench=Split(方法名) 只有前三个参数

go test -bench=Split -benchmem ,会有以下五个参数

BenchmarkSplit-4        600084       1928 ns/op         432 B/op       2 allocs/op

(1)BenchmarkSplit-4 表示对Split函数进行基准测试,数字4表示GOMAXPROCS的值,这个对于并发基准测试很重要。
(2)600084 表示循环次数,即b.N的值
(3)1928 ns/op  600084/op 表示每次调用Split函数耗时172ns,这个结果是600084次调用的平均值
(4)432 B/op 表示每次操作内存分配了96字节 
(5)2 allocs/op 则表示每次操作进行了1次内存分配。 

基准测试示例

SubStrRange_test.go

package main

import "testing"

func SubStrRange(s string, length int) string {
	var n, i int
	for i = range s {
		if n == length {
			break
		}
		n++
	}
	return s[:i]
}

func BenchmarkSubStrRange(b *testing.B) {
	for i := 0; i < b.N; i++ {
		SubStrRange(bmSubString, bmSubStringLen)
	}
}

运行结果

go test -bench=SubStrRange -benchmem

goos: windows
goarch: amd64
pkg: go-coding/tools/translations/substring
BenchmarkSubStrRange-4       12901033          96.0 ns/op         0 B/op          0 allocs/op
PASS
ok      go-coding/tools/translations/substring  1.585s

胡梦旭博客
请先登录后发表评论
  • latest comments
  • 总共0条评论