测试代码性能的方法,查看那种解决方案的性能可能会更好的时候,基准测试会更有用,基准测试可以识别效率问题,测试不同的并发模式,工作池的大小和数量

我们看一组基准测试的函数,找出将整数值转为字符串的最快方法

在标准库中,有三种方法可以实现整数转为字符串

我们分别看一下,三种方式的测试

基准测试的文件名必须要以_test.go结尾,也必须要导入testing包

然后是一个基准测试函数

func BenchmarkSprintf(b *testing.B) {

number := 10

b.ResetTimer()

for i := 0; i < b.N; i++ {

fmt.Sprintf(“%d”, number)

}

}

第一个基准测试函数,名为BenchmarkSprintf,基准测试函数以Benchmark开头,接受一个指向testing.B类型的指针作为唯一参数

然后测试的时候,利用for循环来将其转为字符串

fmt.Sprintf函数,将整数值转为字符串的函数

for循环调用要测试的函数,每次调用增加b.N的值,

我们在运行的时候,加入-bench选项,代码基本如下

go test -v -run=”none” -bench=”BenchmarkSprintf”

go test中我们给run传递了none,none排除了所有的单元测试

运行得到如下的输出

图片

上面说明了Sprintf运行的次数和性能

我们还能设置运行的时间,来进行测试,每次操作的时间

图片

还有两个基准测试函数

// BenchmarkFormat provides performance numbers for the

// strconv.FormatInt function.

func BenchmarkFormat(b *testing.B) {

number := int64(10)

b.ResetTimer()

for i := 0; i < b.N; i++ {

strconv.FormatInt(number, 10)

}

}

// BenchmarkItoa provides performance numbers for the

// strconv.Itoa function.

func BenchmarkItoa(b *testing.B) {

number := 10

b.ResetTimer()

for i := 0; i < b.N; i++ {

strconv.Itoa(number)

}

}

都是基本使用b.N来控制每次调用时候迭代的次数

而且在其中,我们使用b.ResetTimer来重置计时器,然后我们尝试运行这串代码

goos: windows

goarch: amd64

BenchmarkSprintf

BenchmarkSprintf-8    19717318         59.3 ns/op

BenchmarkFormat

BenchmarkFormat-8    540629427          2.22 ns/op

BenchmarkItoa

BenchmarkItoa-8      537918792          2.20 ns/op

PASS

上面说明,我们使用三个函数,最慢的必然是Sprintf,然后就是Itoa和Format不相上下

我们还可以设置每次操作可以分配的内存次数

使用 -benchmem选项

发表评论

邮箱地址不会被公开。 必填项已用*标注