GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

jrfonseca

gprof2dot – プロファイリング出力をドットグラフに変換

投稿日:

プロファイリング出力をドットグラフに変換します。

gprof2dotについて

これは、多くのプロファイラの出力をドットグラフに変換するためのPythonスクリプトです。

できる:

gprof2dotによって生成されたグラフのインタラクティブなビューアが必要な場合は、 xdot.pyをチェックします

状態

gprof2dotは現在、私のニーズを満たしており、メンテナンスの時間はほとんどまたはまったくありません。 だから私は、要求された機能が実装される可能性は低いのではないかと懸念しています。

これは、 Linux Gazetteの記事の データのデフォルト設定の結果です。

要件

  • Python :バージョン2.7と3.3で動作することが知られています。 以前のリリースではうまく動作しない可能性があります。
  • Graphviz :バージョン2.26.3でテストされましたが、他のバージョンでも正常に動作するはずです。

Windowsユーザー

Debian / Ubuntuユーザー

  • 実行:

    apt-get install python graphviz
    

ダウンロード

ドキュメンテーション

使用法

Usage:
        gprof2dot.py [options] [file] ...

Options:
  -h, --help            show this help message and exit
  -o FILE, --output=FILE
                        output filename [stdout]
  -n PERCENTAGE, --node-thres=PERCENTAGE
                        eliminate nodes below this threshold [default: 0.5]
  -e PERCENTAGE, --edge-thres=PERCENTAGE
                        eliminate edges below this threshold [default: 0.1]
  -f FORMAT, --format=FORMAT
                        profile format: axe, callgrind, hprof, json, oprofile,
                        perf, prof, pstats, sleepy, sysprof or xperf [default:
                        prof]
  --total=TOTALMETHOD   preferred method of calculating total time: callratios
                        or callstacks (currently affects only perf format)
                        [default: callratios]
  -c THEME, --colormap=THEME
                        color map: color, pink, gray, bw, or print [default:
                        color]
  -s, --strip           strip function parameters, template parameters, and
                        const modifiers from demangled C++ function names
  -w, --wrap            wrap function names
  --show-samples        show function samples
  -z ROOT, --root=ROOT  prune call graph to show only descendants of specified
                        root function
  -l LEAF, --leaf=LEAF  prune call graph to show only ancestors of specified
                        leaf function
  --skew=THEME_SKEW     skew the colorization curve.  Values < 1.0 give more
                        variety to lower percentages.  Values > 1.0 give less
                        variety to lower percentages

Linux perf

perf record -g -- /path/to/your/executable
perf script | c++filt | gprof2dot.py -f perf | dot -Tpng -o output.png

オプトファイル

opcontrol --callgraph=16
opcontrol --start
/path/to/your/executable arg1 arg2
opcontrol --stop
opcontrol --dump
opreport -cgf | gprof2dot.py -f oprofile | dot -Tpng -o output.png

xperf

あなたがxperfに慣れていないなら、まずこの優れた記事を読んでください それから:

  • xperfを次のように起動します。

    xperf -on Latency -stackwalk profile
    
  • アプリケーションを実行します。

  • データを保存します。 `xperf -d output.etl

  • ビジュアライザを起動します。

    xperf output.etl
    
  • トレース」メニューで、「 シンボルロード 」を選択します。 必要に応じてシンボルパスを設定します。

  • CPUサンプリンググラフ上の関心領域を選択し、右クリックして、 Summary Tableを選択します。

  • [ ]メニューで、[ スタック ]列が有効で表示されていることを確認します。

  • 行を右クリックし、[ Export Full Table ]を選択してoutput.csvに保存します

  • その後、gprof2dotを

    gprof2dot.py -f xperf output.csv | dot -Tpng -o output.png
    

VTune Amplifier XE

  • プロファイルデータを収集する(GUIからも行うことができる):

    amplxe-cl -collect hotspots -result-dir output -- your-app
    
  • プロファイルデータを次のように視覚化します。

    amplxe-cl -report gprof-cc -result-dir output -format text -report-output output.txt
    gprof2dot.py -f axe output.txt | dot -Tpng -o output.png
    

Kirill Rogozhinのブログ記事もご覧ください。

gprof

/path/to/your/executable arg1 arg2
gprof path/to/your/executable | gprof2dot.py | dot -Tpng -o output.png

Pythonプロファイル

python -m profile -o output.pstats path/to/your/script arg1 arg2
gprof2dot.py -f pstats output.pstats | dot -Tpng -o output.png

python cProfile(以前はlsprofとして知られていました)

python -m cProfile -o output.pstats path/to/your/script arg1 arg2
gprof2dot.py -f pstats output.pstats | dot -Tpng -o output.png

Java HPROF

java -agentlib:hprof=cpu=samples ...
gprof2dot.py -f hprof java.hprof.txt | dot -Tpng -o output.png

詳細については、 Russell Powerのブログ記事を参照してください。

出力

出力グラフのノードは関数を表し、次のレイアウトを持ちます。

+------------------------------+
|        function name         |
| total time % ( self time % ) |
|         total calls          |
+------------------------------+

ここで:

  • 合計時間%は、この関数とそのすべての子プロセスで費やされた実行時間の割合です。
  • self time%は、この関数だけで費やした実行時間の割合です。
  • total callsは、この関数が呼び出された総回数(再帰呼び出しを含む)です。

エッジは2つの関数間の呼び出しを表し、次のレイアウトを持ちます。

           total time %
              calls
parent --------------------> children

場所:

  • 合計時間%は、子から親に転送された実行時間のパーセンテージ(使用可能な場合)です。
  • callsは、親関数が子を呼び出した呼び出しの数です。

再帰的サイクルでは、ノード内の合計時間%はサイクル内の関数全体で同じであり、サイクル内のエッジの合計時間%は存在しないことに注意してください。

ノードとエッジの色は、 合計時間%値によって変化します。 デフォルトの温度のようなカラーマップでは、ほとんどの時間が費やされている機能(ホットスポット)は赤色でマークされ、時間のかかる機能は濃い青色でマークされます。 無視できる時間がかかっていない関数はデフォルトではグラフに表示されません。

よくある質問

どのようにして完全なコールグラフを生成できますか?

デフォルトでは、 gprof2dot.py部分的なコールグラフを生成しますが、総計算時間にほとんどまたはまったく影響しないノードとエッジは除きます。 --node-thresグラフが必要な場合は、 -n / --edge-thresオプションと-e / --edge-thresオプションを使用して、ノードとエッジのしきい値をゼロに設定します。

gprof2dot.py -n0 -e0

ノードラベルが大きすぎます。 どうすればそれらを絞り込むことができますか?

スコープ、関数引数、およびテンプレート引数をデマングルC ++関数名に含めるため、C ++コードのプロファイリング時にノードラベルが非常に大きくなる可能性があります。

関数とテンプレート引数の情報が必要ない場合は、 -s / --stripオプションを渡してそれらを--stripます。

これらの情報をすべて保持したい場合や、ラベルの幅が広すぎる場合は、 -w / --wrapてラベルをラップすることができます。 dotはラベルを自動的に折り返さないので、ラベルのマージンは完全には整列しません。

なぜ出力がないのですか、それともすべて同じ色になっていますか?

おそらく、実行時間の合計が短すぎるため、時間がどこに費やされているかを判断するのにプロファイルに十分な精度がありません。

-n / --edge-thresオプションと-e / --edge-thresオプションを使用して、ノードとエッジのしきい値をゼロに設定することで、グラフ全体を強制的に表示することができます。

gprof2dot.py -n0 -e0

しかし、意味のある結果を得るためには、プログラムを長い時間実行する方法を見つけ出す必要があります(複数の実行結果を集計します)。

なぜパーセンテージが足りないのですか?

実行時間が短すぎる可能性が高いため、丸め誤差が大きくなります。

実行時間を増やす方法については、上記の質問を参照してください。

プロファイリング用にコンパイルするときに、どのオプションをgccに渡すべきですか?

適切な結果を得るために不可欠なオプションは次のとおりです。

  • -g :デバッグ情報を生成する
  • -fno-omit-frame-pointer :フレームポインタを使用します(フレームポインタの使用は、x86_64などのいくつかのアーキテクチャではデフォルトで無効になっていますが、いくつかの最適化レベルでは無効になっています。

gprofを使用している場合は、 -pgオプションも必要ですが、現在は他のプロファイリングツールではるかに優れた結果を得ることができますが、そのほとんどはコンパイル時に特別なコード計測を必要としません。

プロファイリングしているコードを、リリースするコードに可能な限り近いものにしたいとします。 したがって、リリースコードで使用するすべてのオプションを含める必要があります。

  • -O2 :空間速度のトレードオフを伴わない最適化
  • -DNDEBUG :標準ライブラリ内のデバッグコードを無効にする(アサートマクロなど)

しかし、gccによって実行される最適化の多くは、プロファイリング結果の精度/細分性を妨害します。 特定の最適化を無効にするには、次のオプションを渡す必要があります。

  • -fno-inline-functions :親に関数をインライン化しないでください(そうしないと、これらの関数に費やされる時間は呼び出し側に帰されます)
  • -fno-inline-functions-called-once :上記と同様です。
  • -fno-optimize-sibling-calls-fno-optimize-sibling-callsと尾部再帰呼び出しを最適化しません(そうでなければ末尾呼び出しは親関数に起因する可能性があります)

粒度が依然として小さすぎる場合は、これらのオプションを渡して粒度を細かくすることができます。

  • -fno-default-inline :クラススコープ内で定義されているため、メンバー関数を-fno-default-inlineしない
  • -fno-inline :インラインキーワードには注意しないでください。ただし、これらの最後のオプションでは、関数呼び出しのオーバーヘッドのために何度も呼び出される関数のタイミングが歪んでしまうことに注意してください。 これは、典型的なC ++コードで 、これらの最適化がまともなパフォーマンスのために行われることを期待している場合に特に当てはまります。

詳細については、gcc最適化オプションの完全なリストを参照してください。

リンク

補完的/代替的なツールを含む外部リソースについては、 wikiを参照してください。







-jrfonseca
-, , ,

執筆者: