2つの大きなByteBufferの4バイトごとに以下を実行します。 (最初から2番目のアルファを引くと、アルファが0未満に行くことができない;。RGBAデータ)最小の0の減算のためのより速いバイト計算
static void subtractAlphaSecondFromFirst (ByteBuffer first, ByteBuffer second, int pixelCount) {
for (int i = 3; i < pixelCount * 4; i = i + 4) {
byte a = first.get(i);
byte b = second.get(i);
first.put(i, (byte)Math.max(0, a - b));
}
}
私はJNIに飛び込む前に、私は(byte)Math.max(0, a - b)
にいくつかの速度向上を得ることができるかどうかを確認したいのですが表現。同じことを達成するビット単位の操作がいくつかありますか?私は、確かに2バイトを整数に昇格させるより速い方法があり、その上にmax()
を実行し、バイトにキャストするのがより高速な方法だと思いますが、それを思いつくのは苦労しています。
私がC言語に移植すると、私はまだ同じ方程式を保つと思います。
maxファンクションと整数シャッフルを削除するには、 'first.put(i、(a> b)?a-b:0)'を実行できますか? – Serdalis
あなたの数学が正しいかどうか分からないのは、「バイト」が符号付きの型だからです。 「a」の値が「0xFF」/「255」で、「b」が「0」である場合、どのような結果が期待できますか?私はalphaに '0xFF' /' 255'という結果を与えるはずですが、あなたのコードは '0'になります.Math.max(0、-1 - 0)= = 0 'となる。 – msandiford
何かをする前に、ループで費やされた時間が実際には非常に単純な数学、max()とキャストであるかどうかをプロファイラで調べる必要があります。私はそれを疑います。経験からは、ByteBuffer get/put(およびそこにあるすべてのインデックスチェック)が時間がかかると推測します。しかし、私の言葉をそれに服用しないでください。測定する。 :-) – haraldK