0

次のおもちゃのコードを考えると、私はなぜプロファイラが動作しないのですか?

go tool pprof cpu.prof 

を実行し、waster1とwaster2に関する有用な情報を得ることができることを期待するが、私はpprofでトップを実行したときに、私が得るすべては次のとおりです。

Showing nodes accounting for 0, 0% of 0 total 
     flat flat% sum%  cum cum% 

package main 

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

func waster2() int { 
    j := 0; 
    for i := 0; i < 100; i++ { 
     j += waster1() 
    } 
    return j 
} 

func waster1() int { 
    j := 0; 
    for i := 0; i < 10000; i++ { 
     j++ 
    } 
    return j 
} 

func main() { 
    f, err := os.Create("cpu.prof") 

    if err != nil { 
     log.Fatal("could not create CPU profile: ", err) 
    } 

    if err := pprof.StartCPUProfile(f); err != nil { 
     log.Fatal("could not start CPU profile: ", err) 
    } 

    defer pprof.StopCPUProfile() 

    j := waster2() 

    fmt.Println(j) 
} 

ことが可能であるという問題は、私はここで

のWindows 10上のUbuntuを実行するようにWSLを使用していますということですが、私が使用していたコードです

+0

上のUbuntuを実行するようにWSLを使用していることは、それ自体がDebianのランニングで同じことをしているように見えますので、Windowsの10の事は赤ニシンであるということです。 –

+0

まず、バイナリを 'pprof'の引数として提供する必要があります。あなたのプログラムはどのくらいの期間実行されますか?意味のあるプロフィールを作成するのに十分なサンプルがないかもしれません。 – JimB

+0

@ JimB addは関数に(現在は10秒以上のランタイムで)スリープし、toolコマンドのバイナリはまだ出力されません。 –

答えて

1

Windows上で実行すると、プロファイラにサンプルが生成されません。以下、外出先のブログの状態からarticleを次

When CPU profiling is enabled, the Go program stops about 100 times per second and 
records a sample consisting of the program counters on the currently executing 
goroutine's stack. 

あなたのコードを実行しているより少ないことが2msを要するので、プロファイラがサンプルを採取することはできません。ループカウントを100から10000に増やすと、出力にサンプルがいくつか表示されます。

別の注意点として、ファイルfを閉じてください。これと同じように:

if err != nil { 
    log.Fatal("could not create CPU profile: ", err) 
} 
defer f.Close() 
+0

関数と遅延関数にスリープを追加しました。これは10秒以上実行され、pprofには出力されません。 –

+1

プロファイラは、CPUが動作していない時間を追跡しません。最大ループ回数を増やしてみましたか? –

関連する問題