プロファイルしようとしている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
、これは私には間違っているように思われ(そうではないでしょうか?) 、「高価な操作」が完了するまでに約10秒かかるにもかかわらず、十分な時間についてmain
は何も言及されていません。monte
サンプラーがそれを見ることができます。--focus=monte
フラグをに渡すとgo tool pprof
、サンプルはまったく表示されません。どこかにフラグがないのではないかと思います。誰かアイデアはありますか?ありがとう!