4

現在、Java ネイティブの通信に JNA を使用していますが、その単純さに満足しています。ただし、パフォーマンスを最適化する必要があり、他のバインディングの使用を検討しています。

私の質問はこれです: Java ネイティブ通信のどの部分が「高価な」部分ですか? それらの間のデータの受け渡しですか?

別の言い方をしましょう。現在、私の JNA インターフェイスが呼び出している関数は Java にデータをまったく渡さず、関数はそれほど頻繁には呼び出されません。つまり、Java がライブラリ呼び出しを呼び出すと、ライブラリ呼び出しはしばらくの間独自の処理を行い、プリミティブ型を返します。そのような状況では、JNI/Swig/etc は JNA よりも速くなりますか?

4

1 に答える 1

6

ユースケースを考えると、JNIはJNAよりも高速ではありません。

Java ネイティブの対話でコストがかかるのは、大量のメモリを転送することです。特に、Java メモリをネイティブ コードで使用できるようにするには、非常にコストがかかる可能性があります。IIRC これは、Java が好きなようにメモリをセグメント化することを選択できるためですが、ネイティブ コードはメモリの連続したチャンクを想定しているためです。メモリの移動/コピーには時間がかかります。

パフォーマンスが気になる場合は、JNA コードが元のインターフェイス スタイル アクセスではなく、「直接」スタイル アクセスを使用していることを確認してください。

さらに、Java とネイティブ コードの間で大量のメモリを転送する必要がある場合は、(可能であれば) 単一の初期直接割り当てを使用することを検討し、そのメモリを定期的に再割り当てしないようにする必要があります。この方法では、割り当てコストを最初に 1 回だけ支払うため、多数の呼び出しでコストが無視できるようになります。

于 2010-02-14T03:59:55.900 に答える