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

印刷ビューの終了

更新: 2015 年 1 月
 
 

インライン関数

インライン関数とは、実際の呼び出しの代わりに、コンパイラが生成した命令がその関数の呼び出し位置に挿入される関数のことです。インライン化には、C++ のインライン関数定義と明示的または自動的なインライン化の 2 種類があり、どちらもパフォーマンスを向上させるために実行され、またどちらもパフォーマンスアナライザに影響を与えます。

  • C++ のインライン関数定義。このようにインライン化する理由は、関数呼び出しのコストがインライン関数によって行われる作業よりはるかに大きいためです。関数呼び出しを設定するより、関数のコードを呼び出し位置に挿入する方が優れています。一般に、アクセス関数は、必要な命令が 1 つだけであることが多いため、インライン化対象として定義されます。–g オプションでコンパイルすると、関数のインライン化は無効になります。–g0 でコンパイルすると、関数のインライン化が許可されます。この方法が推奨されます。

  • 高レベルの最適化 (4 および 5) で行われる明示的または自動的なインライン化。明示的および自動的なインライン化は、–g が有効なときにも行われます。この種のインライン化を行うのは、関数呼び出しの時間を節約するための場合もあります。しかし、多くの場合は、レジスタの利用や命令の実行スケジューリングを最適化できる命令数を増やすためです。

いずれのインライン化も、メトリックの表示に同じ影響を及ぼします。ソースコードに記述されていて、インライン化された関数は、関数リストにも、また、そうした関数のインライン化先の関数の呼び出し先としても表示されません。通常ならば、インライン化された関数の呼び出し位置で包括的メトリックとみなされるメトリック (呼び出された関数で費やされた時間を表す) が、実際には呼び出し位置 (インライン化された関数の命令を表す) が原因の排他的メトリックと報告されます。


注 -  インライン化によってデータの解釈が難しくなることがあります。このため、パフォーマンス解析のためにプログラムをコンパイルするときには、インライン化を無効にすることを推奨します。C++ アクセス関数のインライン化は、パフォーマンスコストの上昇を避けるため、無効にすべきではありません。

場合によっては、関数がインライン化されている場合も、いわゆるライン外関数が残されます。一部の呼び出し側ではライン外関数が呼び出され、それ以外では命令がインライン化されます。このような場合、関数は関数リストに含まれますが、関連するメトリックはライン外呼び出しだけを表します。