JavaでJNI呼び出しを行うと「境界を越える」のが遅いことを知っています。
しかし、それが遅くなる原因は何ですか?非常に遅くなるJNI呼び出しを行うときに、基になるjvm実装は何をしますか?
JavaでJNI呼び出しを行うと「境界を越える」のが遅いことを知っています。
しかし、それが遅くなる原因は何ですか?非常に遅くなるJNI呼び出しを行うときに、基になるjvm実装は何をしますか?
回答:
まず、「遅い」というのは、数十ナノ秒かかる可能性があることについて話していることは注目に値します。ささいなネイティブメソッドについては、2010年にWindowsデスクトップで平均40 ns、Macデスクトップで平均11 nsの呼び出しを測定しました。あなたが多くの呼び出しをしているのでない限り、あなたは気づかないでしょう。
とはいえ、ネイティブメソッドの呼び出しは、通常のJavaメソッドの呼び出しよりも遅くなる可能性があります。原因は次のとおりです。
おそらく日付が付けられたいくつかの追加の議論は、スティーブウィルソンとジェフケッセルマンによる「Java "プラットフォームパフォーマンス:戦略と戦術」2000年のセクション「9.2:JNIコストの調査」にあります。下の@Philipのコメントで提供されているこのページの約3分の1です。
2009年のIBM developerWorksペーパー「Java Native Interfaceを使用するためのベストプラクティス」では、JNIによるパフォーマンスの落とし穴を回避するためのいくつかの提案を提供しています。
sun.misc.Unsafe
と他の多くのようなものSystem.currentTimeMillis/nanoTime
はJVMによって「魔法」を介して処理されます。それらはJNIではなく、適切な.c / .hファイルがまったくないため、JVM impl自体は除外されます。あなたがJVMを書いたりハッキングしたりしない限り、このアプローチに従うことはできません。
でマークされたすべてのJavaメソッドnative
が「遅い」とは限らないことに言及する価値があります。それらのいくつかは、それらを非常に高速にする組み込み関数です。組み込みのものとそうでないものを確認するにはdo_intrinsic
、vmSymbols.hppを探します。
基本的に、JVMは各JNI呼び出しのCパラメータを解釈的に構築し、コードは最適化されません。
このホワイトペーパーでは、より多くの詳細について概説しています。
JNIとネイティブコードのベンチマークに興味がある場合、このプロジェクトにはベンチマークを実行するためのコードがあります。