画像処理機能の一部として、画像内の 2 つの線の間の平方和を計算する必要があります。
コードのこの部分は、実行時間の 96% を占めます。
for(int dx=0;dx<size;dx++) {
int left = a[pa+dx];
int right = b[pb+dx];
int diff = (left & 0xFF) - (right & 0xFF);
sum += diff*diff;
}
どこ:
a
、b
タイプですbyte[]
sum
はlong
size
でありint
、一般的に大きな値を持っています (約 400)
Java 7 64 ビットを実行しています。
性能が良くないa[pa+dx]
ようなものに交換しようとしました。a[pa++]
正確に保存を行う C++ で書かれたまったく同じコードは、全体的に 2 倍速く実行されます (!)。私が見る限り、特に境界チェックがコンパイラによるループ。
このようなものを C++ コードと同様に実行するように最適化するにはどうすればよいですか?
編集: C++ サンプルは次のようになります。
unsigned char const *srcptr=&a[pa];
unsigned char const *tgtptr=&b[pb];
for(int dx=0;dx < size;dx++) {
int p1=*srcptr++;
int p2=*tgtptr++;
int diff = p1 - p2;
sum += diff * diff;
}
HotSpot オプティマイザを作成して、上記の C++ コードと同じくらい高速なコードを作成する方法を見つけたいと思います。最終的に、行を最適化するのは非常に単純で簡単です。