我尝试分析我的 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
...
并且在使用基准测试时,会在那里创建二进制文件并使用它给出相同的结果。
一只名叫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
- 2 回答
- 0 关注
- 146 浏览
添加回答
举报
0/150
提交
取消