为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
Qyouu 2021-12-20 15:52:27
我尝试分析我的 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我得到PASSBenchmarkFile-16    2000000000           0.20 ns/opok      .../writer/iowriter 9.074s比分析它# go tool pprof cpu.out Entering interactive mode (type "help" for commands)(pprof) top10930ms 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 中所示的内容,但结果相同。我做错了什么,我如何确定我的库的瓶颈是什么?先感谢您
查看完整描述

2 回答

?
米脂

TA贡献1836条经验 获得超3个赞

好吧,这很简单,我想添加二进制文件到 go tool pprof,si 它必须是


# 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

    ...

并且在使用基准测试时,会在那里创建二进制文件并使用它给出相同的结果。


查看完整回答
反对 回复 2021-12-20
?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

要扩展 sejvolnd 的答案:

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

所以你需要运行命令 go tool pprof <go binary of your program> <generaged profiling output file>

例如 go tool pprof go_binary cpu.pprof


查看完整回答
反对 回复 2021-12-20
  • 2 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信