Oracle® Solaris Studio 12.4: パフォーマンスアナライザ

印刷ビューの終了

更新: 2015 年 1 月
 
 

動的にコンパイルされる関数

動的にコンパイルされる関数は、プログラムの実行中にコンパイルおよびリンクされる関数です。コレクタ API 関数collector_func_load() を使用して必要な情報をユーザーが提供しないかぎり、コレクタは C や C++ で記述された動的にコンパイルされる関数に関する情報を持っていません。「関数」ビュー、「ソース」ビュー、および「逆アセンブリ」ビューに表示される情報は、次のように、collector_func_load() に渡される情報によって異なります。

  • 情報が指定されない場合、collector_func_load() は呼び出されません。動的にコンパイルおよびロードされた関数は、<Unknown> として関数リストに表示されます。パフォーマンスアナライザには、関数ソースも逆アセンブリコードも表示されません。

  • ソースファイル名や行番号テーブルは指定されていないが、関数の名前、そのサイズとアドレスが指定されている場合は、動的にコンパイルおよびロードされた関数の名前とそのメトリックが関数リストに表示されます。注釈付きソースが使用可能であり、逆アセンブリ命令が表示されます。ただし、行番号は、不明であることを示すために [?] で指定されます。

  • ソースファイル名は指定されているが、行番号テーブルが指定されていない場合、ソースファイル名を指定しない場合と同様の情報がパフォーマンスアナライザによって表示されます。ただし、注釈付きソースの先頭には、関数が行番号のない命令で構成されていることを示す特殊なインデックス行が表示されます。次に例を示します。

    1.121     1.121          <Function func0, instructions without line numbers>
                          1. #include        <stdio.h>
  • ソースファイル名と行番号テーブルが指定されている場合、関数とそのメトリックは、従来の方法でコンパイルされた関数と同様に「関数」ビュー、「ソース」ビュー、および「逆アセンブリ」ビューに表示されます。

コレクタ API 関数の詳細については、動的な関数とモジュールを参照してください。

Java プログラムでは、ほとんどのメソッドが JVM ソフトウェアによってインタプリタされます。別個のスレッドで動作する Java HotSpot 仮想マシンは、インタプリタの実行中にパフォーマンスをモニターします。モニタリングプロセス中、仮想マシンは、1 つ以上の解釈されたメソッドを取得し、それらのメソッドのためのマシンコードを生成し、元のマシンコードを解釈するのではなくさらに効率的なマシンコードバージョンを実行すると決定する場合があります。

Java プログラムの場合は、コレクタ API 関数を使用する必要はありません。パフォーマンスアナライザは、次の例に示すように、メソッドのインデックス行の下にある特殊な行を使用して、注釈付き逆アセンブリリスト内に Java HotSpot コンパイル済みコードが存在することを示します。

                   11.    public int add_int () {
                   12.       int       x = 0;
2.832     2.832      <Function: Routine.add_int: HotSpot-compiled leaf instructions>
0.        0.         [ 12] 00000000: iconst_0
0.        0.         [ 12] 00000001: istore_1

逆アセンブリリストには、コンパイルされた命令ではなく、解釈されたバイトコードのみが示されます。デフォルトでは、コンパイルされたコードのメトリックは、特別な行の隣りに表示されます。排他的および包括的 CPU 時間は、解釈されたバイトコードの行ごとに示されているすべての包括的および排他的 CPU 時間の合計とは異なります。一般に、メソッドが何回か呼び出された場合、コンパイルされた命令の CPU 時間は、解釈されたバイトコードの CPU 時間の合計より長くなります。この不一致は、解釈されたコードがメソッドの最初の呼び出し時に 1 回だけ実行されるのに対して、コンパイルされたコードはそれ以降に実行されるために発生します。

注釈付きソースには、Java HotSpot でコンパイルされた関数は表示されません。その代わりに、行番号なしで命令を示す特別なインデックス行が表示されます。たとえば、前述の例で逆アセンブリの抽出に対応する注釈付きソースは次のようになります。

                     11.    public int add_int () {
2.832     2.832        <Function: Routine.add_int(), instructions without line numbers>
0.        0.         12.       int       x = 0;
                       <Function: Routine.add_int()>