このオプションを使用して実行頻度データを収集して保存すると、後続の実行ではそのデータを使用してパフォーマンスを向上させることができます。このオプションは、-xO2 以上の最適化のレベルを指定した場合にのみ有効です。
-xprofile は、コンパイル時ばかりでなく、リンク時にも指定する必要があります。表 A–2 に、コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションの全一覧をまとめています。
高い最適化レベル (-xO5 など) を指定したコンパイルは、コンパイラに実行時のパフォーマンスフィードバックを提供することで拡張されます。実行時のパフォーマンスフィードバックを生成させるためには、-xprofile=collect を指定してコンパイルし、標準的なデータセットで実行可能ファイルを実行し、次に最高の最適化レベルと -xprofile=use を指定して再コンパイルします。
プロファイルの収集は、マルチスレッド対応のアプリケーションにとって安全です。すなわち、独自のマルチタスク (-mt) を実行するプログラムをプロファイリングすることで、正確な結果が得られます。
p には、collect[:<名前>]、use[:<名前>]、または tcov のいずれか 1 つを指定します。
collect[:<名前>]
実行後に -xprofile=use を指定してオプティマイザで使用するために、実行頻度データを収集して保存します。コンパイラによって文の実行頻度を測定するためのコードが生成されます。
Linux で共有ライブラリを構築する場合は、-xprofile=collect を指定しないでください。
<名前> には分析するプログラム名を指定します。この名前はオプションです。<名前> の指定を省略すると、a.out が実行可能ファイルの名前とみなされます。
環境変数 SUN_PROFDATA および SUN_PROFDATA_DIR を設定すると、-xprofile=collect でコンパイルされたプログラムがプロファイルデータを格納する場所を制御できます。これらの環境変数を設定すると、-xprofile=collect データが SUN_PROFDATA_DIR/SUN_PROFDATA に書き込まれます。
これらの環境変数は、tcov で書き込まれたプロファイルデータファイルのパスと名前も指定します。tcov(1) マニュアルページを参照してください。
これらの環境変数を設定しない場合、プロファイルデータは現在のディレクトリの <名前> profile/feedback に書き込まれます。ここで <名前> には、実行可能ファイルの名前、または -xprofile=collect:<名前> フラグで指定された名前が入ります。 <名前> に拡張子 .profile がすでに含まれている場合、<名前> に .profile は付加されません。プログラムを複数回実行する場合、実行頻度のデータがフィードバック ファイルに蓄積されます。つまり、過去のプログラム実行の出力が失われることはありません。
別々の手順でコンパイルしてリンクする場合は、-xprofile=collect を指定してコンパイルしたオブジェクトファイルは、リンクでも必ず -xprofile=collect を指定してください。
use[:<名前>]
-xprofile=collect でコンパイルしたプログラムを前回実行したときに作成されたフィードバックファイルに保存された実行頻度のデータに基づいて、プログラムが最適化されます。
<名前> には分析するプログラム名を指定します。この名前はオプションです。<名前> の指定を省略すると、a.out が実行可能ファイルの名前とみなされます。
-xprofile オプション (-xprofile=collect から -xprofile=use に変わります) を除き、ソースファイルおよびコンパイラのほかのオプションは、フィードバックファイルを生成したコンパイル済みプログラムのコンパイルに使用したものと完全に同一のものを指定する必要があります。同じバージョンのコンパイラは、収集構築と使用構築の両方に使用する必要があります。-xprofile=collect:<名前> を使用してコンパイルする場合は、最適化コンパイルでも同じ名前 (<名前>) が使用されていなければいけません。-xprofile=use:<名前>
オブジェクトファイルとそのプロファイルデータの関連付けは、-xprofile=collect を指定してコンパイルしたときのオブジェクトファイルの UNIX パス名に基づいています。場合によっては、コンパイラはオブジェクトファイルとそのプロファイルデータの関連付けを行いません。これは、前回 -xprofile=collect を指定してコンパイルされなかったためオブジェクトファイルにプロファイルデータがない場合、オブジェクトファイルが -xprofile=collect でプログラムにリンクされていない場合、プログラムが一度も実行されていない場合などです。
さらに、オブジェクトファイルが前回異なるディレクトリ内で -xprofile=collect を指定してコンパイルされ、-xprofile=collect でコンパイルされたほかのオブジェクトファイルと共通ベース名を共有しているが、それらのファイルを格納しているディレクトリの名前によって一意に識別できない場合も、コンパイラは正しく処理できなくなります。この場合、オブジェクトファイルにプロファイルデータがあっても、オブジェクトファイルが -xprofile=use で再コンパイルされたときに、コンパイラはフィードバックディレクトリ内でそのプロファイルデータを見つけることができません。
このようなあらゆる状況によって、コンパイラはオブジェクトファイルとプロファイルデータの関連付けを失います。したがって、オブジェクトファイルがプロファイルデータを持っているのに、-xprofile=use を指定したときにコンパイラがプロファイルデータをオブジェクトファイルのパス名に関連付けできない場合は、-xprofile_pathmap オプションを使用して正しいディレクトリを特定します。詳細は、「B.2.131 -xprofile=p」を参照してください。
tcov
「新しい」形式の tcov を使った基本ブロックカバレージ解析です。
-xprofile=tcov オプションは、新しい形式の tcov 用基本ブロックプロファイリングです。機能は -xa オプションと類似していますが、ヘッダーファイルにソースコードがあるプログラムまたは C++ テンプレートを使用するプログラムのデータを正確に収集します。古い形式のプロファイリングについては、「B.2.66 -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 カバレージ解析のデータが不正確になることがあります。
-xprofile=collect を指定してプロファイルの収集用にコンパイルを行い、-xprofile=use を指定してプロファイルのフィードバック用にコンパイルを行う場合は、ソースファイルおよび -xprofile=collect と -xprofile=use 以外のコンパイラオプションが両方のコンパイルで同一である必要があります。
-xprofile=use:<名前> オプションで指定するプロファイルのフィードバックのディレクトリ名を複数指定した場合は、コンパイラの 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