4

(完全なJavaアプリケーションを作成する代わりに)JNIを使​​用してネイティブコード(Cで作成)を実際に利用できるかどうかを確認するために、JNIを介した呼び出しのオーバーヘッドを測定します。このオーバーヘッドを測定するための最良の方法は何ですか?

4

3 に答える 3

2

定量的なパフォーマンステストを行うためにプロファイラーを使用することはありません。プロファイリングは、実際のタイミング数に歪みをもたらす傾向があります。

Cで実行することを検討している実際の計算の1つを実行するベンチマークを作成し、C + JNI+Javaバージョンを純粋なJavaバージョンと比較します。リンゴとリンゴを比較していることを確認してください。つまり、ベンチマークを行う前に、両方のバージョンのプロファイルを作成して最適化します。

実際のベンチマークを行うには、計算を何度も実行するループを作成し、多数の反復にわたってタイミングを記録して比較します。JVMのウォームアップ効果を考慮に入れてください。たとえば、クラスの読み込み、JITコンパイル、ヒープのウォームアップ。


ティハラのように、C+JNIを使​​用することが大いに役立つとは思えません。たとえそうだとしても、JNIの欠点を考慮する必要があります。たとえば、Cコードの移植性、プラットフォーム固有のビルドの問題...ネイティブコードにバグがある場合、JVMがハードクラッシュする可能性があります。

于 2012-06-08T04:40:27.500 に答える
1

オーバーヘッドだけを測定すると、奇妙な結果が得られる場合があります。JavaとC++の両方でパフォーマンスが重要なコードのごく一部をコーディングし、プログラムのパフォーマンスを測定します。たとえば、 キャリパーを使用します(マイクロベンチマークは非常に複雑で、誰も正しく理解することはできません)。

プロファイラー、特にC ++プロファイラーは使用しません。これは、C ++部分のパフォーマンスだけでは問題がなく、プロファイラーが結果を歪める可能性があるためです。

于 2012-06-08T05:06:21.610 に答える
0

C++プロファイラーとJavaプロファイラーを使用します。これらは、Java用のIDEで使用できます。ただし、C++の場合にのみ想定できます。また、設計するテストが何であれ、環境エラーを最小限に抑えるために、かなりの数のループを実行してください。

最近のJVMよりもネイティブコードの使用に改善があるかどうかも知りたいので、結果を投稿してください。ただし、ネイティブコードでパフォーマンスが大幅に向上することはないでしょう。

于 2012-06-08T04:18:06.720 に答える