【发布时间】:2017-08-08 00:30:53
【问题描述】:
众所周知,整数除法运算速度很慢(通常比整数乘法慢几倍)。但是,如果需要使用固定除数执行许多除法运算,则可以对除数进行一些预处理并将“/”替换为乘法和位运算(Hacker's Delight 中的第 10 章)。
正如我所测试的,如果除数是编译时常量(例如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 中流水线化的)。
【问题讨论】:
标签: java performance division integer-division