このオプションを使用して実行頻度データを収集して保存すると、後続の実行ではそのデータを使用してパフォーマンスを向上させることができます。このオプションは、-xO2 以上の最適化のレベルを指定した場合にのみ有効です。
-xprofile は、コンパイル時ばかりでなく、リンク時にも指定する必要があります。表 A–2 に、コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションの全一覧をまとめています。
高い最適化レベル (-xO5 など) を指定したコンパイルは、コンパイラに実行時のパフォーマンスフィードバックを提供することで拡張されます。実行時のパフォーマンスフィードバックを生成させるためには、-xprofile=collect を指定してコンパイルし、標準的なデータセットで実行可能ファイルを実行し、次に最高の最適化レベルと -xprofile=use を指定して再コンパイルします。
追加機能と環境変数の制御の詳細は、cc(1) のマニュアルページも参照してください。
プロファイルの収集は、マルチスレッド対応のアプリケーションにとって安全です。すなわち、独自のマルチタスク (-mt) を実行するプログラムをプロファイリングすることで、正確な結果が得られます。
p には、collect[: name]、use[: name]、または tcov のいずれか 1 つを指定します。
collect[:name]
実行後に -xprofile=use を指定してオプティマイザで使用するために、実行頻度データを収集して保存します。コンパイラによって文の実行頻度を測定するためのコードが生成されます。
name は、プログラムを実行するときにプロファイルデータの保存先となるディレクトリに関するオプションの名前です。name を指定する場合は、UNIX の絶対パス名にするべきです。name を指定しない場合は、program を実行するときに、program によって指定されたプロファイル対象プログラムに対応するプロファイルデータが、現在の作業ディレクトリ内にある、 program.profile という名前のディレクトリに保存されます。
環境変数 SUN_PROFDATA および SUN_PROFDATA_DIR を設定すると、-xprofile=collect でコンパイルされたプログラムがプロファイルデータを格納する場所を制御できます。これらの環境変数を設定すると、-xprofile=collect データが SUN_PROFDATA_DIR/SUN_PROFDATA に書き込まれます。
これらの環境変数は、tcov で書き込まれたプロファイルデータファイルのパスと名前も指定します。tcov(1) マニュアルページを参照してください。
これらの環境変数が設定されていない場合は、現在の作業ディレクトリ内の name.profile/feedback に書き込まれますが、name は実行可能ファイルの名前、または -xprofile=collect: name フラグで指定された名前です。name の末尾がすでに .profile になっている場合は、-xprofile を指定しても name に .profile は追加されません。プログラムを複数回実行する場合、実行頻度のデータがフィードバック ファイルに蓄積されます。つまり、過去のプログラム実行の出力が失われることはありません。
別々の手順でコンパイルしてリンクする場合は、-xprofile=collect を指定してコンパイルしたオブジェクトファイルは、リンクでも必ず -xprofile=collect を指定してください。
3 つのオプション -xMerge -ztext -xprofile=collect を一緒に使用するべきではありません。-xMerge を指定すると、静的に初期化されたデータを読み取り専用記憶領域に強制的に配置します。 -ztext を指定すると、位置に依存するシンボルを読み取り専用記憶領域内で再配置することを禁止します。-xprofile=collect を指定すると、書き込み可能記憶領域内で、静的に初期化された、位置に依存するシンボルの再配置を生成します。
use[:name;]
-xprofile=collect でコンパイルしたプログラムを前回実行したときに作成されたフィードバックファイルに保存された実行頻度のデータに基づいて、プログラムが最適化されます。
name には、解析対象の実行可能ファイル名を指定します。この名前はオプションです。name; の指定を省略すると、a.out が実行可能ファイルの名前とみなされます。
-xprofile オプション (-xprofile=collect から -xprofile=use に変わる) を除き、ソースファイルおよびコンパイラのほかのオプションは、フィードバックファイルを生成したコンパイル済みプログラムのコンパイルに使用したものと完全に同一のものを指定する必要があります。同じバージョンのコンパイラは、収集構築と使用構築の両方に使用する必要があります。-xprofile=collect:name を使用してコンパイルする場合は、最適化コンパイルでも同じ名前 (name) が使用されていなければいけません。-xprofile=use:name
オブジェクトファイルとそのプロファイルデータの関連付けは、-xprofile=collect を指定してコンパイルしたときのオブジェクトファイルの UNIX パス名に基づいています。場合によっては、コンパイラはオブジェクトファイルとそのプロファイルデータの関連付けを行いません。前回 -xprofile=collect を指定してコンパイルされなかったためオブジェクトファイルにプロファイルデータがない場合、オブジェクトファイルが -xprofile=collect でプログラムにリンクされていない場合、プログラムが一度も実行されていない場合などです。
さらに、オブジェクトファイルが前回異なるディレクトリ内で -xprofile=collect を指定してコンパイルされ、-xprofile=collect でコンパイルされたほかのオブジェクトファイルと共通ベース名を共有しているが、それらのファイルを格納しているディレクトリの名前によって一意に識別できない場合も、コンパイラは正しく処理できなくなります。この場合、オブジェクトファイルにプロファイルデータがあっても、オブジェクトファイルが -xprofile=use で再コンパイルされたときに、コンパイラはフィードバックディレクトリ内でそのプロファイルデータを見つけることができません。
このようなあらゆる状況によって、コンパイラはオブジェクトファイルとプロファイルデータの関連付けを失います。したがって、オブジェクトファイルがプロファイルデータを持っているのに、-xprofile=use を指定したときにコンパイラがプロファイルデータをオブジェクトファイルのパス名に関連付けできない場合は、-xprofile_pathmap オプションを使用して正しいディレクトリを特定します。詳細は、「B.2.140 -xprofile_pathmap」 を参照してください。
tcov
「新しい」形式を使用する基本ブロックのカバレージ解析 tcov。
-xprofile=tcov オプションは、新しい形式の tcov 用基本ブロックプロファイリングです。機能は -xa オプションと類似していますが、ヘッダーファイルにソースコードがあるプログラムまたは C++ テンプレートを使用するプログラムのデータを正確に収集します。古い形式のプロファイリングについては、「B.2.70 -xa」、tcov(1) のマニュアルページ、および『プログラムのパフォーマンス解析』を参照してください。
時間計測コードの組み込みは -xa オプションの場合と同様に実行されますが、.d ファイルは生成されません。その代わりにファイルが 1 つ生成されます。このファイルの名前は最終的な実行可能ファイルに基づきます。たとえば、プログラムが /foo/bar/myprog.profile から実行されると、データファイルは /foo/bar/myprog.profile/myprog.tcovd に格納されます。
-xprofile=tcov と -xa オプションは、同じ実行可能ファイル内に指定することができます。すなわち、-xprofile=tcov でコンパイルされたファイルと-xa でコンパイルされたファイルが両方含まれたプログラムをリンクすることができます。1 つのファイルを両方のオプションでコンパイルすることはできません。
tcov を実行する時点で、新しい形式のデータを使用させるように -x オプションを渡さなければいけません。これを渡さないと、古い .d ファイルがまだ存在する場合に、tcov はデフォルトで古いファイルからデータを使用するため、予想に反した出力が生成されます。
-xa オプションの場合とは異なり、TCOVDIR 環境変数はコンパイル時には影響力を持ちません。ただし、TCOVDIR 環境変数の値はプログラムの実行時に使用されます。tcov(1) のマニュアルページおよび『プログラムのパフォーマンス解析』を参照してください。
-xO4 または -xinline によるルーチンのインライン化が存在する場合、tcov カバレージ解析のデータが不正確になることがあります。
Linux プラットフォームで共有ライブラリを構築するときは、-xprofile=collect または -xprofile=tcov を、-G とともに使用するべきではありません。
-xprofile=collect を指定してプロファイルの収集用にコンパイルを行い、-xprofile=use を指定してプロファイルのフィードバック用にコンパイルを行う場合は、ソースファイルおよび -xprofile=collect と -xprofile=use 以外のコンパイラオプションが両方のコンパイルで同一である必要があります。
-xprofile=use: name; オプションで指定するプロファイルのフィードバックのディレクトリ名を複数指定した場合は、コンパイラの 1 回の呼び出しですべて使用できます。たとえば、プロファイル対象のバイナリ a、b、c を実行した結果、プロファイルのディレクトリa.profile、b.profile、c.profile が生成されたとします。
cc -O -c foo.c -xprofile=use:a -xprofile=use:b -xprofile=use:c |
このとき、3 つのプロファイルのディレクトリがすべて使用されます。特定のオブジェクトファイルに関係する有効なプロファイルのフィードバックデータは、オブジェクトファイルのコンパイル時に、指定したフィードバックのディレクトリから累積されます。
-xprofile=collect と -xprofile=use の両方を同一のコマンド行で指定した場合は、コマンド行で一番右側の -xprofile オプションは次のように適用されます。
一番右側の -xprofile オプションが -xprofile=use の場合は、-xprofile=use で指定したすべてのプロファイルフィードバックディレクトリ名がフィードバック指定の最適化で使用され、このオプションよりも前の -xprofile=collect オプションは無視されます。
一番右側の -xprofile オプションが -xprofile=collect の場合は -xprofile=use で指定したすべてのプロファイルフィードバックディレクトリ名は無視され、プロファイル生成の計測が有効になります。
関連項目: -xhwcprof、-xprofile_ircache、-xprofile_pathmap