Поскольку все мы знаем, что есть угощение для получения остатка для:
m = остаток
n = число
d = делитель, положительное целое число
m = n & (d - 1)
Работает для d = 2 ^ k (k - положительное целое число)
Для JDK 12 я использую jmh для проверить эффективность:
@State(Scope.Thread)
public static class Generator {
SequentialGenerator sequentialGenerator = new SequentialGenerator(1, Integer.MAX_VALUE);
SequentialGenerator powerGenerator = new SequentialGenerator(1, 17);
}
@Benchmark
@Warmup(iterations = 1)
@Measurement(iterations = 120)
public void mod2_1(Generator generator) {
int pow = generator.powerGenerator.nextValue().intValue();
int factor = 1 << pow;
int i = generator.sequentialGenerator.nextValue().intValue();
for (long j = 0; j < 1000L; j++) {
int k = i & (factor -1);
}
}
@Benchmark
@Warmup(iterations = 1)
@Measurement(iterations = 120)
public void mod2_2(Generator generator) {
int pow = generator.powerGenerator.nextValue().intValue();
int factor = 1 << pow;
int i = generator.sequentialGenerator.nextValue().intValue();
for (long j = 0; j < 1000L; j++) {
int k = i % factor;
}
}
Результат показывает, что% более эффективен, чем &, почему:
Benchmark Mode Cnt Score Error Units
BitUtilTest.mod2_1 thrpt 120 1218565.022 ± 32816.798 ops/s
BitUtilTest.mod2_2 thrpt 120 2045390.684 ± 56090.355 ops/s