2017-02-23 1 views
2

私は、Linuxのtimeユーティリティを使用して、私の囲碁プログラムの実行時間を計測すると、私は次のような出力を得る:私は同じ正確なプログラム実行の出力を見てみるとゴープロファイラ(pprof)タイミング不一致

real 1m9.177s 
user 7m1.788s 
sys  0m39.016s 

をGoのpprof CPUプロファイラでは、次の出力が得られます。

Entering interactive mode (type "help" for commands) 
(pprof) top 
143.32s of 176s total (81.43%) 

この176sの数値はどこから得られますか?クロック時間でもCPU時間でもありません。私はGOMAXPROCSを8に設定してこのプログラムを実行していますが、これには何か関係があります。どのように正確にpprofがランタイムを測定するのですか?それはlinuxのtimeと何故違うのですか?

答えて

3

ユーティリティtimeユーティリティとpprofツールは異なる方法で動作し、異なる方法で使用する必要があります。それらを調和させようとしないでください。 timeはプログラムのほぼ正確な時間を測定します。 pprofは、関数とメソッドの相対時間を測定します。 pprofは、侵入的な統計的サンプルです。 CPUプロファイリングが有効になると、Goプログラムは1秒間に約100回停止し、現在実行中のゴルーチンのスタック上にプログラムカウンタで構成されるサンプルを記録します。サンプリングにはコストがかかり、結果は実際の人口の推定値です。

timeを使用して、プログラムの全体の実際のCPU時間(絶対時間)を測定します。相対時間パーセンテージを使用して関数とメソッドで費やされた時間を推定するには、pprofを使用します。 pprofはボトルネックを特定します。実際のCPU時間については、Go testingパッケージベンチマークを使用してください。例えば

Profiling Go Programsを参照してください。

を特定 ボトルネックを特定するために行くのプロファイリングツールを使用して、正しいことで、私達は行くループ発見プログラムが速く 大きさの順に実行させるおよび6x少ないメモリを使用することができます。

0

これはいくつかのバグのようです。おそらく既知のバグです。 176sを出力するためにpprofが行うのは、既知のサンプリング周期にサンプル数を乗算することです。そしてそれは合理的に正確であるべきです。プロセス(システム+ユーザー)が費やした合計CPU時間。

あなたのプログラムがサブプロセスを介していくつかの仕事を起こす可能性はありますか?それは違いを説明する一つの方法かもしれません。