我正在尝试分析Go二进制文件,并且得到了令人惊讶的结果。该代码的中有以下(被截断的)main.go代码,其余代码在软件包中monte:
package main
import (
"monte"
"runtime/pprof"
)
var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")
func main() {
flag.Parse()
if *cpuprofile != "" {
f, err := os.Create(*cpuprofile)
if err != nil {
log.Fatal(err)
}
pprof.StartCPUProfile(f)
}
monte.ExpensiveOperation()
pprof.StopCPUProfile()
}
我用构建我的可执行文件go build src/main.go,然后用运行它./main -cpuprofile=monte.prof。当我使用检查输出时go tool pprof main monte.prof,得到以下输出:
(pprof) top10 --cum
Total: 346 samples
280 80.9% 80.9% 343 99.1% time.Time.Format
0 0.0% 80.9% 341 98.6% runtime.interhash
0 0.0% 80.9% 341 98.6% runtime.main
0 0.0% 80.9% 251 72.5% strconv.Unquote
13 3.8% 84.7% 31 9.0% strconv.roundShortest
11 3.2% 87.9% 18 5.2% strconv.fmtE
9 2.6% 90.5% 9 2.6% runtime.markallocated
1 0.3% 90.8% 8 2.3% math/rand.Float64
2 0.6% 91.3% 8 2.3% runtime.FixAlloc_Free
7 2.0% 93.4% 8 2.3% time.nextStdChunk
具有最大累积时间的函数是time.Time.Format,这对我来说似乎是错误的(应该不是main吗?)monte,尽管“昂贵的操作”大约需要10秒钟才能完成,但没有任何提及让采样器看到它。如果我将--focus=monte标志传递给go tool pprof,则根本不会显示任何示例。我认为我在某处缺少一些标志;有人有什么想法吗?谢谢!
元芳怎么了
相关分类