プロファイリングは、アプリケーションの性能を分析するために使います。
アプリケーションの性能は、関数が何回呼び出されたか、それらの関数の実行にどのくらいの時間がかかったか、どの関数が他の関数を呼び出しているかによって測定できます。これにより、実行に時間がかかりすぎたり、実行回数が多すぎたりして、最適化の可能性があり検討すべき関数を特定できます。
FreeBASIC はアプリケーションの実行解析に GPROF を使うことができます。 プロファイラの情報はプログラムの実行中に収集され、GPROF は収集されたデータを後で報告するために使われます。
プログラムをプロファイリングするための3つの基本的なステップは次のとおりです:
- 1) -profile または -profgen gmon オプションを使ってソースをコンパイルし、プロファイリング用にプログラムを準備します。
- 2) プログラムを実行して情報を収集します(gmon.out に保存されます)。
- 3) GPROF を使って収集された情報を分析します。
GPROF の完全なドキュメントはこちらです:
https://ftp.gnu.org/old-gnu/Manuals/gprof-2.9.1/html_mono/gprof.html
ドキュメントの URL が変更されている場合は、Web で「GNU GPROF」を検索するだけで、関連するリンクを見つけることができるでしょう。
FreeBASIC は関数プロファイリングをサポートしていますが、基本ブロックまたは行単位のプロファイリングはサポートしていません。
プロファイリングのために、プログラムを準備する (gmon/gprof 用)
-profile または
-profgen gmon コマンドライン オプションを使ってコンパイルされたコードだけをプロファイリングできます。
プログラムをプロファイリングする準備のために、FreeBASIC コンパイラに
-profile または
-profgen gmon オプションを渡します。
例:
fbc program.bas -profile
又は
fbc program.bas -profgen gmon
コンパイラは、これにより、アプリケーションの先頭と各関数の先頭に特別な起動コードを挿入するように指示されます。
プログラムのプロファイリング(gmon/gprof用)
プログラムの実行を分析するために必要な情報は、プログラムの実行中に収集されます。
プログラムを実行して、関数呼び出し情報の収集を開始します。この情報は、プログラムと同じディレクトリにある gmon.out というファイルに自動的に保存されます。
プログラムの出力を分析する
GPROF を使って出力を分析します。GPROF のデフォルト レポートには、各列の値の意味に関する説明が含まれています。
GPROF を初めて使用する場合は、まずデフォルト レポートを実行して説明を読んでください。
GPROF からの出力は、リダイレクトによってファイルに保存できます。
GPROF からの出力を
profile.txt に保存する:
gprof program[.exe] > profile.txt
説明なしのフラットレポートだけを表示する:
gprof program[.exe] --brief --flat-profile > profile.txt
複数のセッションの結果を組み合わせる
GPROF には、複数の実行セッションの結果を簡単に組み合わせるための '--sum' オプションがあります。以下は使用可能な例です:
- Run your program once. This will create gmon.out.
- Use the command :
mv gmon.out gmon.sum
or
rename gmon.out gmon.sum.
- Run your program again. This will create new data in gmon.out.
- Merge the new data in gmon.out into gmon.sum using the command:
gprof --sum program[.exe] gmon.out gmon.sum
- Repeat the last two steps as often as needed.
- Analyze the summary data using the command:
gprof program[.exe] gmon.sum > profile.txt
FreeBASIC プロファイリング (gmon/gprof 用) 内部機能
'-profile' オプションを有効にすると、プログラムに 1ビット以上のコードが追加されます。
- 暗黙の main の最初に "_monstartup()" を呼び出して、プロファイリング ライブラリを初期化します。
- 各手続きの開始時に "mcount()" を呼び出します。これにより、プロファイリング ライブラリは、どの関数が他のどの関数によって実行されているかを追跡します。
- 追加のプログラム起動オブジェクト コードのリンク。(例: gcrt?.o )
プロファイリング ライブラリ自体は、別のライブラリに含まれている場合もあれば、C ランタイム ライブラリの一部に含まれている場合もあります。
- mingw には gcrt2.o と libgmon.a が必要です
- cygwin には gcrt0.o と libgmon.a が必要です
- dos には gcrt0.o が必要です (プロファイラー コードは libc.a にあります)
- Linux では gcrt1.o が必要です (プロファイラー コードは libc.a にあります)
詳細は FreeBASIC のポートによって異なる場合がありますが、FreeBASIC でプロファイリング用にビルドされたソース コードは、GPROF をサポートしている他の言語と互換性があるはずです。