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

时间:2016-03-08 15:57:28

标签: go profiling

我尝试对我的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所示,但结果相同。

我做错了什么,如何确定我的lib的瓶颈是什么? 提前谢谢

2 个答案:

答案 0 :(得分:7)

好吧,我很想添加二进制文件去工具pprof,它必须是

# go tool pprof write cpu.out 
Entering interactive mode (type "help" for commands)
(pprof) top10
7.02s of 7.38s total (95.12%)
Dropped 14 nodes (cum <= 0.04s)
Showing top 10 nodes out of 32 (cum >= 0.19s)
      flat  flat%   sum%        cum   cum%
     6.55s 88.75% 88.75%      6.76s 91.60%  syscall.Syscall
    ...

当使用基准测试时,在那里创建二进制文件并使用它得到相同的结果。

答案 1 :(得分:0)

扩展sejvolnd的回答:

pprof需要实际生成cpu.out文件的二进制文件作为第一个参数。

因此您需要以go tool pprof <go binary of your program> <generaged profiling output file>

运行命令

e.g。 go tool pprof go_binary cpu.pprof