0
整数除算は低速操作(通常、整数乗算より数倍遅い)であることはよく知られています。しかし、固定除数で多くの除算演算を実行する必要がある場合は、除数の前提条件をいくつか行い、 "/"を乗算とビット演算(Hacker's Delightの第10章)に置き換えることができます。Javaでの高速整数分割
除数がコンパイル時定数(例:static final long DIVISOR = 12345L;
)の場合、JVMはすべての除算をDIVISOR
で乗算とビット演算で置き換えます。私は同じ種類のトリックで面白いですが、除数は実行時にのみ分かっています。例えば
、以下の(遅い)方法:
void reduceArraySlow(long[] data, long denominator){
for(int i = 0; i < data.length; ++i)
data[i] = data[i]/denominator;
}
が何かに置き換えることができます:
すべて/
操作が速いと交換されているので、はるかに高速に仕事をしなければなりません
void reduceArrayFast(long[] data, long denominator){
SomeMagicStructure magic = computeMagic(denominator);
for(int i = 0; i < data.length; ++i)
// computes data[i]/denominator
data[i] = doFastDivision(data[i], magic);
}
(また、CPUでは分割がパイプライン化されていないため)。