サーチ…


gccとgprofによるプロファイリング

GNU gprofプロファイラgprofを使用すると、コードをプロファイルすることができます。これを使用するには、以下の手順を実行する必要があります。

  1. プロファイリング情報を生成するための設定でアプリケーションを構築する

  2. 構築されたアプリケーションを実行してプロファイリング情報を生成する

  3. 生成されたプロファイリング情報をgprofで表示する

プロファイリング情報を生成するための設定でアプリケーションをビルドするには、 -pgフラグを追加します。したがって、たとえば、

$ gcc -pg *.cpp -o app

または

$ gcc -O2 -pg *.cpp -o app

等々。

appというアプリケーションがビルドされたら、通常どおり実行します。

$ ./app

これにより、 gmon.outというファイルが生成されgmon.out

プロファイリング結果を確認するには、今すぐ実行してください

$ gprof app gmon.out

(アプリケーションと生成された出力の両方を提供することに注意してください)。

もちろん、パイプまたはリダイレクトすることもできます:

$ gprof app gmon.out | less

等々。

最後のコマンドの結果は、行が関数で、呼び出し数、合計所要時間、自己消費時間(つまり、関数呼び出しで子プロセスへの呼び出しを除く時間)を示す表でなければなりません。

gperf2dotによるコールグラフダイアグラムの生成

より複雑なアプリケーションでは、フラットな実行プロファイルを追うのが難しい場合があります。これが、多くのプロファイリングツールが注釈付きのコールグラフ情報の何らかの形を生成する理由です。

gperf2dotは 、多くのプロファイラ(Linux perf、callgrind、oprofileなど)からのテキスト出力をコールグラフダイアグラムに変換します。プロファイラを実行することで使用できます( gprof例):

# compile with profiling flags  
g++ *.cpp -pg
# run to generate profiling data                                            
./main
# translate profiling data to text, create image     
gprof ./main | gprof2dot -s | dot -Tpng -o output.png

ここに画像の説明を入力

gccとGoogle PerfツールによるCPU使用率のプロファイリング

Google Perfツールには、少し面白いインターフェースを備えたCPUプロファイラも用意されています。それを使用するには:

  1. Google Perfツールをインストールする
  2. いつものようにコードをコンパイルする
  3. 実行時にライブラリロードパスにlibprofilerプロファイラライブラリを追加する
  4. pprofを使用して、フラット実行プロファイルまたはコールグラフダイアグラムを生成する

例えば:

# compile code
g++ -O3 -std=c++11 main.cpp -o main

# run with profiler
LD_PRELOAD=/usr/local/lib/libprofiler.so CPUPROFILE=main.prof CPUPROFILE_FREQUENCY=100000 ./main

ここで:

  • CPUPROFILEは、プロファイリング・データの出力ファイルを示します。
  • CPUPROFILE_FREQUENCYは、プロファイラのサンプリング周波数を示します。

プロファイリングデータを後処理するには、 pprofを使用します。

フラット・コール・プロファイルをテキストとして生成することができます。

$ pprof --text ./main main.prof
PROFILE: interrupts/evictions/bytes = 67/15/2016
pprof --text --lines ./main main.prof
Using local file ./main.
Using local file main.prof.
Total: 67 samples
      22  32.8%  32.8%       67 100.0% longRunningFoo ??:0
      20  29.9%  62.7%       20  29.9% __memmove_ssse3_back /build/eglibc-3GlaMS/eglibc-2.19/string/../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:1627
       4   6.0%  68.7%        4   6.0% __memmove_ssse3_back /build/eglibc-3GlaMS/eglibc-2.19/string/../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:1619
       3   4.5%  73.1%        3   4.5% __random_r /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random_r.c:388
       3   4.5%  77.6%        3   4.5% __random_r /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random_r.c:401
       2   3.0%  80.6%        2   3.0% __munmap /build/eglibc-3GlaMS/eglibc-2.19/misc/../sysdeps/unix/syscall-template.S:81
       2   3.0%  83.6%       12  17.9% __random /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random.c:298
       2   3.0%  86.6%        2   3.0% __random_r /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random_r.c:385
       2   3.0%  89.6%        2   3.0% rand /build/eglibc-3GlaMS/eglibc-2.19/stdlib/rand.c:26
       1   1.5%  91.0%        1   1.5% __memmove_ssse3_back /build/eglibc-3GlaMS/eglibc-2.19/string/../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:1617
       1   1.5%  92.5%        1   1.5% __memmove_ssse3_back /build/eglibc-3GlaMS/eglibc-2.19/string/../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:1623
       1   1.5%  94.0%        1   1.5% __random /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random.c:293
       1   1.5%  95.5%        1   1.5% __random /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random.c:296
       1   1.5%  97.0%        1   1.5% __random_r /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random_r.c:371
       1   1.5%  98.5%        1   1.5% __random_r /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random_r.c:381
       1   1.5% 100.0%        1   1.5% rand /build/eglibc-3GlaMS/eglibc-2.19/stdlib/rand.c:28
       0   0.0% 100.0%       67 100.0% __libc_start_main /build/eglibc-3GlaMS/eglibc-2.19/csu/libc-start.c:287
       0   0.0% 100.0%       67 100.0% _start ??:0
       0   0.0% 100.0%       67 100.0% main ??:0
       0   0.0% 100.0%       14  20.9% rand /build/eglibc-3GlaMS/eglibc-2.19/stdlib/rand.c:27
       0   0.0% 100.0%       27  40.3% std::vector::_M_emplace_back_aux ??:0

...またはPDFで注釈付きコールグラフを生成することができます:

pprof --pdf ./main main.prof > out.pdf


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow