サーチ…
gccとgprofによるプロファイリング
GNU gprofプロファイラgprofを使用すると、コードをプロファイルすることができます。これを使用するには、以下の手順を実行する必要があります。
プロファイリング情報を生成するための設定でアプリケーションを構築する
構築されたアプリケーションを実行してプロファイリング情報を生成する
生成されたプロファイリング情報を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プロファイラも用意されています。それを使用するには:
- Google Perfツールをインストールする
- いつものようにコードをコンパイルする
- 実行時にライブラリロードパスに
libprofiler
プロファイラライブラリを追加する -
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