Javaの組み込み関数は、さまざまな場所で言及されている(例えばここ)。私の理解では、これらが特別なネイティブコードで処理する方法であるということです。また、これはネイティブコードのブロックであるJNIメソッドに似ているようです。
違いはなんですか?
それは、ホットループの一部としてコードそれのJITing、及びその周りの最適化に関連する機械語命令をインライン化することができますので、JITは、組み込み関数を知っています。
A JNI関数は、(あなただけスカラーのためにそれを使用する場合は特に)重要なコール/リターン・オーバーヘッドで、コンパイラのための100%のブラックボックスです。
しかし、それはのような関数への呼び出しだけであったとしてもint bitcount(unsigned x){ return __builtin_popcount(x); }
x86-64のにコンパイルされていますpopcnt eax, edi
。ret
(x86-64のSystem Vの呼び出し規約)(JITコンパイラが放出される)、呼び出し側は、まだすべてのコール-上書きさレジスタが上書きされたと仮定しなければならないでしょう。整数レジスタおよびすべてのFP /ベクトルレジスタのほとんどをだx86-64で、オン。(ただ、本来の対ブラックボックス機能を呼び出すための先行・オブ・タイムC ++コンパイラのための費用など)。しかし、私は、JNI関数を呼び出すためのコストは、その上にいくつかの余分なオーバーヘッドが含ま疑い。
JITコンパイラは、他に何もそれらへの参照を持っていないことを証明できない場合は、レジスタにあった変数がメモリに同期する必要があることどんな未知の機能手段に、そしてもちろんのコール。(分析をエスケープします。)
プラス、組み込み関数は、JVMの意味を理解機能が何をし、それを介して最適化することができます。例えば、定数伝播と、そのPOPCOUNT(5)= 2セットのビットを知っています。しかし、実際のJNI機能と、それはまだそれを呼び出す必要があります。それができるように、「純粋」として関数を宣言するためにいくつかの方法がありますしない限り、すべてのコールは、目に見える副作用であるCSEが。
重いインライン化すると、コンパイル時定数はまれではありません。