0
衆所周知整數除法是(比整數乘法慢通常數次)緩慢的操作。但是,如果一個人需要用一個固定除數執行許多除法運算,可以做一些預處理對除數和替換「/」與乘法和位操作(第10章Hacker's Delight)。我測試過,如果除數是一個編譯時間常量(例如static final long DIVISOR = 12345L;
),JVM就會執行這個技巧,並用乘法和位操作替換所有除數DIVISOR
。我在同一種技巧中很有趣,但是隻有在運行時才知道除數。快速整數除法中的Java
例如,下面的(慢)方法:
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);
}
必須更快地完成工作,因爲所有/
操作與更快的更換:
void reduceArraySlow(long[] data, long denominator){
for(int i = 0; i < data.length; ++i)
data[i] = data[i]/denominator;
}
可以用什麼來代替操作(也因爲除法在CPU中不流水線)。