猿问

Golang 分析 - top10 仅显示一行 100%

我尝试分析我的 go 库,以找出比 C++ 中的同一件事慢得多的原因。


我有简单的基准


func BenchmarkFile(t *testing.B) {

    tmpFile, err := ioutil.TempFile("", TMP_FILE_PREFIX)


    fw, err := NewFile(tmpFile.Name())

    text := []byte("testing")

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

        _, err = fw.Write(text)

    }

    fw.Close()

}

NewFile 返回我的自定义 Writer,它将数据编码为我们的二进制表示,甚至压缩它们,并写入文件系统。


运行go test -bench . -memprofile mem.out -cpuprofile cpu.out我得到


PASS

BenchmarkFile-16    2000000000           0.20 ns/op

ok      .../writer/iowriter 9.074s

比分析它


# go tool pprof cpu.out 

Entering interactive mode (type "help" for commands)

(pprof) top10

930ms of 930ms total (  100%)

      flat  flat%   sum%        cum   cum%

     930ms   100%   100%      930ms   100%  

(pprof) 

我什至尝试编写使用我的编写器的 example.go 应用程序,并添加pprof.StartCPUProfile(f)如http://blog.golang.org/profiling-go-programs 中所示的内容,但结果相同。


我做错了什么,我如何确定我的库的瓶颈是什么?先感谢您


Qyouu
浏览 147回答 2
2回答

米脂

好吧,这很简单,我想添加二进制文件到 go tool pprof,si 它必须是# go tool pprof write cpu.out&nbsp;Entering interactive mode (type "help" for commands)(pprof) top107.02s of 7.38s total (95.12%)Dropped 14 nodes (cum <= 0.04s)Showing top 10 nodes out of 32 (cum >= 0.19s)&nbsp; &nbsp; &nbsp; flat&nbsp; flat%&nbsp; &nbsp;sum%&nbsp; &nbsp; &nbsp; &nbsp; cum&nbsp; &nbsp;cum%&nbsp; &nbsp; &nbsp;6.55s 88.75% 88.75%&nbsp; &nbsp; &nbsp; 6.76s 91.60%&nbsp; syscall.Syscall&nbsp; &nbsp; ...并且在使用基准测试时,会在那里创建二进制文件并使用它给出相同的结果。

一只名叫tom的猫

要扩展 sejvolnd 的答案:pprof需要实际生成cpu.out文件的二进制文件作为第一个参数。所以你需要运行命令&nbsp;go tool pprof <go binary of your program> <generaged profiling output file>例如&nbsp;go tool pprof go_binary cpu.pprof
随时随地看视频慕课网APP

相关分类

Go
我要回答