Go语言 如何使用pprof工具分析基准测试?

6fe3ivhb  于 2023-02-20  发布在  Go
关注(0)|答案(3)|浏览(155)

我想评测我的go test -c生成的基准测试,但是go tool pprof需要一个通常在main函数内部生成的评测文件,比如this

func main() {
    flag.Parse()
    if *cpuprofile != "" {
        f, err := os.Create(*cpuprofile)
        if err != nil {
            log.Fatal(err)
        }
        pprof.StartCPUProfile(f)
        defer pprof.StopCPUProfile()
    }

如何在基准测试中创建配置文件?

a8jjtwal

a8jjtwal1#

如www.example.com中所述https://pkg.go.dev/cmd/go#hdr-Testing_flags,您可以使用标志-cpuprofile指定配置文件。
例如

go test -cpuprofile cpu.out
k0pti3hp

k0pti3hp2#

-cpuprofile标志用于go test,如www.example.com中所述http://golang.org/cmd/go/#hdr-Description_of_testing_flags

lrl1mhuk

lrl1mhuk3#

这篇文章通过一个例子解释了如何分析基准测试:Benchmark Profiling with pprof.
以下基准测试模拟了一些CPU工作。

package main

import (
    "math/rand"
    "testing"
)

func BenchmarkRand(b *testing.B) {
    for n := 0; n < b.N; n++ {
        rand.Int63()
    }
}

要为基准测试生成CPU配置文件,请运行:

go test -bench=BenchmarkRand -benchmem -cpuprofile profile.out

-memprofile-blockprofile标志可用于生成内存分配与阻塞调用配置文件。
要分析轮廓,请使用Go工具:

go tool pprof profile.out
(pprof) top
Showing nodes accounting for 1.16s, 100% of 1.16s total
Showing top 10 nodes out of 22
      flat  flat%   sum%        cum   cum%
     0.41s 35.34% 35.34%      0.41s 35.34%  sync.(*Mutex).Unlock
     0.37s 31.90% 67.24%      0.37s 31.90%  sync.(*Mutex).Lock
     0.12s 10.34% 77.59%      1.03s 88.79%  math/rand.(*lockedSource).Int63
     0.08s  6.90% 84.48%      0.08s  6.90%  math/rand.(*rngSource).Uint64 (inline)
     0.06s  5.17% 89.66%      1.11s 95.69%  math/rand.Int63
     0.05s  4.31% 93.97%      0.13s 11.21%  math/rand.(*rngSource).Int63
     0.04s  3.45% 97.41%      1.15s 99.14%  benchtest.BenchmarkRand
     0.02s  1.72% 99.14%      1.05s 90.52%  math/rand.(*Rand).Int63
     0.01s  0.86%   100%      0.01s  0.86%  runtime.futex
         0     0%   100%      0.01s  0.86%  runtime.allocm

这种情况下的瓶颈是互斥锁,这是由于math/rand中的默认源被同步而引起的。
也可使用其他配置文件显示和输出格式,例如tree。键入help可获得更多选项。
注意,基准循环之前的任何初始化代码也将被分析。

相关问题