@
bxb100 我用 Blackhole 也试了一下,jdk7 版本的没之前那么离谱了,但是还是有些差距。
我又尝试了一下把 大小的校验 和 三元运算 都去掉:
```java
static int tableSizeFor(int cap) {
int n = cap - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return n + 1;
}
static int roundUpToPowerOf2(int cap) {
return Integer.highestOneBit((cap - 1) << 1);
}
static int tableSizeFor_JDK11(int cap) {
return (-1 >>> Integer.numberOfLeadingZeros(cap - 1)) + 1;
}
```
这次跑出来结果就比较真实了,jdk7 和 jdk11 的很接近:
```shell
Benchmark Mode Cnt Score Error Units
TableSizeForTest2.jdk17 avgt 5 54189763.703 ± 5052484.742 ns/op
TableSizeForTest2.jdk7 avgt 5 55255800.741 ± 3588948.883 ns/op
TableSizeForTest2.jdk8 avgt 5 125044190.547 ± 15537228.379 ns/op
```
观察了一下,jdk7 的 roundUpToPowerOf2 方法里是先 判断大小和 三元运算 后再调用 位运算方法(highestOneBit) 得出结果。而 jdk11 的 tableSizeFor 方法是先调用 位运算方法(numberOfLeadingZeros) 得出结果后,再判断大小和三元运算。对计算机和 JVM 底层不是很熟悉,感觉像这块的影响