前进!前进!!不择手段的前进!

基准测试概念

测试代码性能的方法,主要是测试cpu和内存的效率问题。

编写基准测试

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
package main

import (
	"fmt"
	"testing"
)

func Benchmark(b *testing.B) {
	for i := 0; i < b.N; i++ {
		fmt.Sprintf("%d", i)
	}
}xxxxxxxxxx package mainimport (    "fmt"    "testing")func Benchmark(b *testing.B) {    for i := 0; i < b.N; i++ {        fmt.Sprintf("%d", i)    }}func BenchmarkArray(b *testing.B) {    for i := 0; i < b.N; i++ {        something....    }}go

基准测试的规则:

  1. 基准测试的代码文件必须以_test.go结尾
  2. 基准测试的函数必须以Benchmark开头,必须是可导出的
  3. 基准测试函数必须接受一个指向benchmark类型的指针作为唯一参数
  4. 基准测试函数不能有返回值
  5. b.N是基准测试框架提供的,表示循环的次数,因为需要反复地暗涌测试的代码,才可以评估性能
  6. for循环很重要,被测试的代码要放到循环里。

下面运行基准测试:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
go test -bench=. -gcflags="-N -l"


//output
goos: windows
goarch: amd64
pkg: EX
Benchmark-8   	 8111588	       151 ns/op
PASS
ok  	EX	1.638s
  • 基准测试要使用go test命令,

  • -bench=标记,接受一个表达式作为参数,匹配基准测试的函数.表示运行所有的基准测试。

  • Benchmark-8 8111588 151 ns/op

    • -8便是运行时的gomaxprocs的值
    • ``8111588`紧接着的数值是循环的次数
    • 在后面是每次消耗的毫秒数。
    • 测试默认的时间是1秒,如果想让测试运行的时间更长,可以用-benchtime指定,比如:
      • go test -bench=. -benchtime=3s
  • -gcflags="-N -l"禁止编译器优化和内联