Javaインライン関数
1874 ワード
インライン関数を話す前に、関数の呼び出し手順について説明します.
ある関数を呼び出して実際にプログラム実行順序をその関数が格納されているメモリのアドレスに移行し、関数のプログラム内容を実行した後、その関数を実行する前の場所に戻ります.このような転送操作は,転送前に現場を保護し,実行したアドレスを記憶し,転送後に現場を復元し,元の保存アドレスで実行を継続することが要求される.つまり通常の圧屋と出桟ということです.したがって,関数呼び出しには一定の時間と空間的なオーバーヘッドが必要である.では、それらの関数体コードがあまり大きくなく、頻繁に呼び出される関数にとって、この時間と空間の消費は大きくなります.
では、このパフォーマンス消費の問題をどのように解決するか、このときはインライン関数を導入する必要があります.インライン関数とは,プログラムコンパイル時にコンパイラがプログラムに現れるインライン関数の呼び出し式をインライン関数の関数体で直接置き換えることである.このようにして,ターンバックの問題は生じないことは明らかであるが,コンパイル時に関数体のコードをプログラムに置き換えるため,ターゲットプログラムのコード量が増加し,さらに空間オーバーヘッドが増加するが,時間代理販売では関数呼び出し時ほど大きくなく,ターゲットコードの増加を代価として時間の節約を取り替えることが分かる.
大学でCコードを書くことを勉強するとき、私たちはいくつかの短い論理をマクロに定義することを学びました.このような利点は、コンパイラがコンパイルするときに、そのマクロを使用する場所を直接マクロのコードで置き換えることです.これにより、呼び出し方法のようなスタック、スタックを出て、パラメータを伝達する必要がなくなります.性能が向上した.インライン関数の処理方法はマクロと似ていますが、マクロとは異なり、インライン関数は関数自体の特性(タイプ、役割ドメインなど)を持っています.
C++コードを書いたことがある人は知っているはずですが、C++にはインラインキーワードで修飾されたインライン関数があります.また、Class定義に書かれた関数もコンパイラによってインライン関数とみなされます.
ではjavaのインライン関数はどのような形をしているのでしょうか.Javaでfinalキーワードを使用して、関数がインライン関数であることを示します.たとえば、次のようにします.
この指示は必要ではない.finalキーワードはコンパイラに教えるだけで、コンパイル時に性能の向上を考慮してfinal関数をインライン関数と見なすことができます.しかし、最後にコンパイラがどのように処理するか、コンパイラはfinal関数をインラインとして処理するか、インラインとして処理しないかの性能比較を分析します.
##################################################################################################################################
このメソッドは、呼び出されると、呼び出された場所で直接展開され、プログラムの実行速度が向上します.さらにfinalキーワードは、doSomethingメソッドがサブクラスで上書きされることを防止する役割もあります.doSomethingが最終的な動作であることを望む場合は、finalとして設計されるべきです.インラインは必ずしも良いとは限らないが、インラインとして指定されたメソッドが大きい場合、展開のオーバーヘッドは通常の関数呼び出しの時間を超えている可能性があり、インラインを導入するとかえって性能が低下する.このキーワードを選択するには慎重にすべきであるが、以降のバージョンのJVMでは、インラインを処理する際に最適化されるため、メソッドの規模に応じて呼び出しを展開するかどうかを決定します.
転入先http://berdy.iteye.com/blog/803715およびhttp://qaohao.iteye.com/blog/450299
ある関数を呼び出して実際にプログラム実行順序をその関数が格納されているメモリのアドレスに移行し、関数のプログラム内容を実行した後、その関数を実行する前の場所に戻ります.このような転送操作は,転送前に現場を保護し,実行したアドレスを記憶し,転送後に現場を復元し,元の保存アドレスで実行を継続することが要求される.つまり通常の圧屋と出桟ということです.したがって,関数呼び出しには一定の時間と空間的なオーバーヘッドが必要である.では、それらの関数体コードがあまり大きくなく、頻繁に呼び出される関数にとって、この時間と空間の消費は大きくなります.
では、このパフォーマンス消費の問題をどのように解決するか、このときはインライン関数を導入する必要があります.インライン関数とは,プログラムコンパイル時にコンパイラがプログラムに現れるインライン関数の呼び出し式をインライン関数の関数体で直接置き換えることである.このようにして,ターンバックの問題は生じないことは明らかであるが,コンパイル時に関数体のコードをプログラムに置き換えるため,ターゲットプログラムのコード量が増加し,さらに空間オーバーヘッドが増加するが,時間代理販売では関数呼び出し時ほど大きくなく,ターゲットコードの増加を代価として時間の節約を取り替えることが分かる.
大学でCコードを書くことを勉強するとき、私たちはいくつかの短い論理をマクロに定義することを学びました.このような利点は、コンパイラがコンパイルするときに、そのマクロを使用する場所を直接マクロのコードで置き換えることです.これにより、呼び出し方法のようなスタック、スタックを出て、パラメータを伝達する必要がなくなります.性能が向上した.インライン関数の処理方法はマクロと似ていますが、マクロとは異なり、インライン関数は関数自体の特性(タイプ、役割ドメインなど)を持っています.
C++コードを書いたことがある人は知っているはずですが、C++にはインラインキーワードで修飾されたインライン関数があります.また、Class定義に書かれた関数もコンパイラによってインライン関数とみなされます.
ではjavaのインライン関数はどのような形をしているのでしょうか.Javaでfinalキーワードを使用して、関数がインライン関数であることを示します.たとえば、次のようにします.
public final void method1() {
//TODO something
}
この指示は必要ではない.finalキーワードはコンパイラに教えるだけで、コンパイル時に性能の向上を考慮してfinal関数をインライン関数と見なすことができます.しかし、最後にコンパイラがどのように処理するか、コンパイラはfinal関数をインラインとして処理するか、インラインとして処理しないかの性能比較を分析します.
##################################################################################################################################
このメソッドは、呼び出されると、呼び出された場所で直接展開され、プログラムの実行速度が向上します.さらにfinalキーワードは、doSomethingメソッドがサブクラスで上書きされることを防止する役割もあります.doSomethingが最終的な動作であることを望む場合は、finalとして設計されるべきです.インラインは必ずしも良いとは限らないが、インラインとして指定されたメソッドが大きい場合、展開のオーバーヘッドは通常の関数呼び出しの時間を超えている可能性があり、インラインを導入するとかえって性能が低下する.このキーワードを選択するには慎重にすべきであるが、以降のバージョンのJVMでは、インラインを処理する際に最適化されるため、メソッドの規模に応じて呼び出しを展開するかどうかを決定します.
転入先http://berdy.iteye.com/blog/803715およびhttp://qaohao.iteye.com/blog/450299