2016-07-19 8 views
0

Ich habe versucht, in Go (Golang) Leistungsanalyse zu tauchen, basierend auf Artikel wie https://software.intel.com/en-us/blogs/2014/05/10/debugging-performance-issues-in-go-programs.Go CPU-Profil fehlt Funktionsaufruf Informationen

In den tatsächlichen profilierten Programmen haben die generierten CPU-Profile jedoch sehr wenig Informationen. Das go-Tool teilt mit, dass das Profil leer ist oder keine Informationen über Funktionsaufrufe enthält. Dies geschieht sowohl unter OS X als auch unter Linux.

Ich habe ein minimales Beispiel für diese Situation erstellt - ich sammle das Profil in ähnlicher Weise und konfrontiert die gleichen Probleme in tatsächlichen Programmen auch.

Hier ist der Quellcode für miniprofile/main.go:

package main 

import (
    "fmt" 
    "os" 
    "runtime/pprof" 
) 

func do_something(prev string, limit int) { 
    if len(prev) < limit { 
     do_something(prev+"a", limit) 
    } 
} 

func main() { 
    f, err := os.Create("./prof") 
    if err != nil { 
     fmt.Println(err) 
     os.Exit(1) 
    } 
    pprof.StartCPUProfile(f) 
    defer pprof.StopCPUProfile() 

    do_something("", 100000) 
} 

Ich erwarte ein CPU-Profil zu sehen, dass die Zeit fast alles erzählt hat auf verschiedene rekursiven Aufrufen ausgegeben worden do_something.

Allerdings geschieht dies (die minimale App oben genannt miniprofile) - nicht sehr nützlich:

$ go version 
go version go1.6.2 darwin/amd64 
$ go install . 
$ miniprofile 
$ go tool pprof --text prof 
1.91s of 1.91s total ( 100%) 
     flat flat% sum%  cum cum% 
    1.91s 100% 100%  1.91s 100% 

Bin ich etwas in einer fürchterlich falsch gemacht?

Antwort

1

Sie verpassen das binäre Argument pprof:

go tool pprof --text miniprofile prof