プロファイラ
制約伝播の状態を調べて問題箇所を特定するための機能として、プロファイラが提供されています。
ソースコード設定
C言語以外のソースコードとの対応づけを行う場合には、以下の関数を使用してソースコードとの対応づけを提供する必要があります。
-
void cs_setProfilerLocator(const char *fmt, const char *(*locator)(void*), void *extra)
ソースコード内の位置を取得するため関数として、locator を設定します。 引数 extra は自由に使うことのできるvoid型変数へのポインタで、locator 呼び出し時に引数として渡されます。
locator は、fmt に対応した形式で、呼び出し元の情報を表す文字列を返す必要があります。 ユーザコード > 制約設定 > locator の順で呼び出されるため、ネイティブの関数呼び出しスタックをたどる場合にはユーザコードの位置を得るために、通常は 2レベル戻る必要があることに注意してください。(コンパイラの最適化によって異なる場合があります)
fmt は呼び出し元の情報を表すための情報がどのような形式であるかを表します。
"linux_addr2line": gcc の backtrace_symbols で得られるテキストです。
"darwin_atos": clang の backtrace_symbols で得られるテキストです。
"generic": ファイル名,行数,アドレス,関数名 をタブ区切りで連結したものです。
コンストラクタ・デストラクタ
プロファイラオブジェクト(CSprofier型で表現されます)は、以下の関数によって構築・破棄することができます。
-
CSprofiler *cs_createProfiler(int profilerType)
profilerType のプロファイラを作成します。現在サポートされているプロファイラは 0 (制約プロファイラ) のみです。
-
void cs_deleteProfiler(CSprofiler *profiler)
profiler で示されるプロファイラを破棄します。以降、profiler は使用できません。
プロファイラを操作するための関数
CSprofiler 型のプロファイラを操作するためには、以下の関数を使用します。
-
void cs_enableProfiler(CSprofiler *profiler)
profiler による情報収集を開始します。
-
void cs_disableProfiler(CSprofiler *profiler)
profiler による情報収集を停止します。
-
void cs_profilerWrite(CSprofiler *profiler, FILE *fp)
profiler の情報を fp で示されるファイルに書き出します。
-
void cs_profilerWriteFile(CSprofiler *profiler, const char *filename);
profiler の情報を filename で示されるファイルに書き出します。
プロファイリング結果
結果の整形
結果を整形するためには、Perl を使用します。(システムに標準でインストールされていない場合は、追加でインストールする必要があります)
IZ-Profiler を展開したディレクトリを <IZP_DIR> とし、cs_profilerWriteFile で 出力されたファイル名を izprof.txt とすると:
perl <IZP_DIR>/script/izprof2html.pl izprof.txt
とすることにより izprof ディレクトリ以下に整形した結果を得ることができます。 また、出力先のディレクトリは、スクリプトの -o オプションを使用して変更することができます。
制約プロファイラ (profilerType = 0)
制約プロファイラでは、設定された制約ごとに制約伝播の発生数、fail数を数えます。 ただし、ループ内などの同一行で設定された制約については、複数の制約を一つにまとめて集計します
結果の項目
falls : 該当行の制約で発生した fail の数の合計
calls : 該当行の制約で発生した制約伝播の合計
max_fails : 同一行で設定された制約ごとの failの数のうち、最大のもの
max_calls : 同一行で設定された制約ごとの制約伝播の数のうち、最大のもの
n : 同一行で設定されている制約のうち、制約伝播を発生させた制約の数
location : 制約を設定している場所 (可能であればソースコードへのリンクとなります)
constraint : iZ のどの制約を設定しているか