一 基准测试
基准测试:用于测试一段程序的运行性能及CPU消耗
性能测试函数以 Benchmark 为名称前缀,同样保存在 *_test.go 文件里。  
示例:
func Benchmark_Hello(b *testing.B){
    // 开始测试性能相关代码
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        //  测试代码
    }
    // 结束性能测试
    b.StopTimer()
}
测试:
go test -v -bench=Hello          # -bench=.表示运行所有基准测试。win下参数为:-bench="-"
常用参数:
-benchmem             # 显示性能具体的开销情况
-benchtime=5s        # 自定义测试时间为5秒
二 性能监控
利用go的 runtime/pprof 包可以生成prof文件,用来查看go代码的运行情况,示例代码:
package main
import (
    "fmt"
    "os"
    "runtime/pprof"
)
func slowFunc(){
    str := "hello world "
    for i := 0; i < 5; i++ {
        str += str
    }
}
func main() {
    // 创建输出文件
    f, err := os.Create("cpu.prof")
    if err != nil {
        fmt.Println("create cpu.prof err :", err)
        return
    }
    // 获取系统信息
    if err := pprof.StartCPUProfile(f); err != nil {
        fmt.Println("start cpu.prof err :", err)
        return
    }
    defer pprof.StopCPUProfile()
    // 业务代码
    slowFunc()
    // 获取内存相关信息
    f1, err := os.Create("mem.prof")
    defer f1.Close()
    if err != nil {
        fmt.Println("create mem.prof err :", err)
        return
    }
    // runtime.GC()            // 是否获取最新的数据信息
    if err := pprof.WriteHeapProfile(f1); err != nil {
        fmt.Println("write cpu.prof err :", err)
        return
    }
    // 获取协程相关信息
    f2, err := os.Create("goroutine.prof")
    defer f2.Close()
    if err != nil {
        fmt.Println("create goroutine.prof err :", err)
        return
    }
    if gProf := pprof.Lookup("goroutine"); gProf != nil {
        fmt.Println("write goroutine.prof err :", err)
        return
    } else {
        gProf.WriteTo(f2, 0)
    }
    return
}
生成prof文件:
# 生成程序的二进制文件
go build -o program main.go                // 此时会按照代码中的要求生成多份prof文件
# 查看prof文件
go tool pprof program cpu.prof
贴士:
- 导入 
"_ "net/http/pprof"包还可以实现以网页形式展示prof文件内容! - 程序执行前加上环境变量可以查看GC日志,如:
GODEBUG=gctrace=1 go run main.go