1

私は主に C++ プログラマーですが、プロジェクトに Java を使用することを検討しています。パフォーマンス上の理由から、いくつかの SSE 組み込み関数を使用する必要があります (これらは、単純な C++ と比較しても速度を大幅に向上させることができます)。

私が理解しているように、Java でこれを行う方法は、JNI を使用し、C で SSE 組み込み関数を呼び出すことです。ただし、JNI のドキュメントを読んで、JVM がコピーを作成する場合と作成しない場合があると書かれているため、少し不安になりました。 Cに送信されて戻ってくる配列の。

最先端の実装、たとえば OpenJDK 7 を想定すると、 byte[] 、 short[] 、 int[] 、または float[] へのポインターを要求するときに、実際にいつコピーを期待する必要がありますか?

これまでのところ、いくつかの矛盾する主張しか見つかりませんでした。受け入れられるには、答えが私を納得させる必要があります。たとえば、意見/推測を表明するだけでなく、証拠を提供するか、情報源を引用します。

編集

  1. GetPrimitiveArrayCriticalへのリンク
  2. 前述したように、私の質問に答えるときに OpenJDK 7 を想定しても問題ありません。
4

2 に答える 2

4

ネイティブのバイト順で直接 ByteBuffer を使用することを検討します。これの利点は、C 空間のメモリを使用することです。つまり、Java でアクセスするためにコピーする必要がありません (その逆も同様です)。

于 2012-07-02T18:21:18.577 に答える
1

これまでのところ、私が見つけたのはいくつかの矛盾する主張だけでした

いいえ、これらは矛盾する主張ではありません。なぜなら、あなたが求めているのは実装の詳細であり、使用する JDK 実装に依存するからです。
すべての実装で同じ動作を期待する必要はありません。どの実装が目的の動作をするかを調べる必要があります。
実装の違いの例を挙げると、SUNJDK はnull で終了char[]するCコードに渡しますが、IBM はそうしません。
したがって、実装を掘り下げてテストする必要があります。あなたの質問に関しては、メモリ領域全体に変更があると信じているため、配列のコピーが行われない理由がわかりません

于 2012-07-02T18:01:09.000 に答える