(完全なJavaアプリケーションを作成する代わりに)JNIを使用してネイティブコード(Cで作成)を実際に利用できるかどうかを確認するために、JNIを介した呼び出しのオーバーヘッドを測定します。このオーバーヘッドを測定するための最良の方法は何ですか?
3 に答える
定量的なパフォーマンステストを行うためにプロファイラーを使用することはありません。プロファイリングは、実際のタイミング数に歪みをもたらす傾向があります。
Cで実行することを検討している実際の計算の1つを実行するベンチマークを作成し、C + JNI+Javaバージョンを純粋なJavaバージョンと比較します。リンゴとリンゴを比較していることを確認してください。つまり、ベンチマークを行う前に、両方のバージョンのプロファイルを作成して最適化します。
実際のベンチマークを行うには、計算を何度も実行するループを作成し、多数の反復にわたってタイミングを記録して比較します。JVMのウォームアップ効果を考慮に入れてください。たとえば、クラスの読み込み、JITコンパイル、ヒープのウォームアップ。
ティハラのように、C+JNIを使用することが大いに役立つとは思えません。たとえそうだとしても、JNIの欠点を考慮する必要があります。たとえば、Cコードの移植性、プラットフォーム固有のビルドの問題...ネイティブコードにバグがある場合、JVMがハードクラッシュする可能性があります。
オーバーヘッドだけを測定すると、奇妙な結果が得られる場合があります。JavaとC++の両方でパフォーマンスが重要なコードのごく一部をコーディングし、プログラムのパフォーマンスを測定します。たとえば、 キャリパーを使用します(マイクロベンチマークは非常に複雑で、誰も正しく理解することはできません)。
プロファイラー、特にC ++プロファイラーは使用しません。これは、C ++部分のパフォーマンスだけでは問題がなく、プロファイラーが結果を歪める可能性があるためです。
C++プロファイラーとJavaプロファイラーを使用します。これらは、Java用のIDEで使用できます。ただし、C++の場合にのみ想定できます。また、設計するテストが何であれ、環境エラーを最小限に抑えるために、かなりの数のループを実行してください。
最近のJVMよりもネイティブコードの使用に改善があるかどうかも知りたいので、結果を投稿してください。ただし、ネイティブコードでパフォーマンスが大幅に向上することはないでしょう。