JavaでJNI呼び出しを行うときに「境界を越える」ことは遅いことを知っています。
しかし、私は知りたいですwhatそれが遅くなるのはなぜですか?基礎となるjvm実装は、JNI呼び出しを行ってそれを非常に遅くするときに何をしますか?
まず、「遅い」ということは、数十ナノ秒かかる可能性のあることを言っていることは注目に値します。自明なネイティブメソッドの場合、2010年に、Windowsデスクトップでは平均40 ns、Macデスクトップでは11 nsでコールを測定しました。 多くの呼び出しを行っていない限り、気付かないでしょう。
ただし、ネイティブメソッドの呼び出しは、通常のJavaメソッド呼び出しよりもslowerになります。原因は次のとおりです。
日付が付けられている可能性のある追加の議論は、「Java¿プラットフォームパフォーマンス:戦略と戦術」、2000年、スティーブウィルソンとジェフケッセルマンによるセクション「9.2:Examining JNI cost」にあります。約3分の1 このページ で、以下の@Philipのコメントで提供されています。
2009 IBM developerWorksのペーパー 「Java Native Interfaceを使用するためのベストプラクティス」 は、JNIのパフォーマンスの落とし穴を回避するためのいくつかの提案を提供しています。
native
でマークされたすべてのJavaメソッドが「遅い」わけではないことに言及する価値があります。それらのいくつかは intrinsics であり、非常に高速になります。組み込みのものとそうでないものを確認するには、 vmSymbols.hpp でdo_intrinsic
を探します。