他のいくつかのレポートから、人々は通常、プレーンで基本的な JNI 呼び出しで約4 ~ 80 nsを取得することを読みました。
単純なネイティブ メソッドの場合、昨年、Windows デスクトップで平均 40 ns、Mac デスクトップで 11 ns の呼び出しが見つかりました。
ただし、JNI 呼び出しには約 30 ns かかることがよくあります。
JNI コードで単純なメソッドを呼び出すと (単純とは、int 型を返す time int の引数が 1 つだけであることを意味します)、50,000 ~ 80,000 ns の往復呼び出し時間 (System.nanoTIme で測定) が得られます。
VM の「ウォームアップ」を行い、タイミングを計る前に呼び出しを数百回実行しても、約2000 ~ 4000 ns (800 ~ 1000 以下) になります。(上記のように、他の人が 100 ns 未満と報告しているのを聞いたことがあります。頻繁に電話をかけると、それよりも 10 ~ 20 倍高くなります。)
これは通常の速度ですか?ネイティブ コードの呼び出しが非常に遅くなる原因は何ですか?
アップデート:
JNIEXPORT jint JNICALL Java_com_snap2d_gl_RenderControl_correctGammaNative
(JNIEnv *env, jobject obj, jint pixel) {
return X2D_correctGamma(pixel, 1.0f);
}
X2D_correctGamma(int,float) は、ピクセルのガンマ値を修正するメソッドです (投稿後にネイティブ コードを実装しました)。
Java ベンチマーク:
for(int i = 0; i < 100; i++) {
long t1 = System.nanoTime();
correctGammaNative(0xFFF);
long t2 = System.nanoTime();
System.out.println(t2 - t1);
}
それが「ウォームアップ」コードです。ほとんどの println は、最初の呼び出しから 800 ~ 1000 ns を読み取りました。
残念ながら、これはレンダリングで使用されることになっており、これを 1 秒間に何千回も呼び出すとフレーム レートが 1 FPS に低下するため、破棄する必要があるかもしれません。
システム情報:
同様の動作: JDK1.6.0_32 (64 ビット)、JDK1.7.0_04 (64 ビット)、および JRE1.7.0_10 (32 ビット)
Windows 7 64 ビット
16GBのRAM
i7-3770 クアッドコア CPU @ 3.4-3.9ghz
GNU GCC MinGW コンパイラ (32 ビットおよび 64 ビット)