Optimize log2 in PoolThreadCache (#10128)
Motivation: The current implementation of log2 in PoolThreadCache uses a loop and less efficient than an version based on Integer.numberOfLeadingZeros (intrinsic). Modifications: Replace the current log2 implementation in PoolThreadCache with a version based on Integer.numberOfLeadingZeros Result: It can improve performance slightly during allocation and de-allocation of ByteBuf using pooled allocator.
This commit is contained in:
parent
cb8fdd6c73
commit
71b7dbc009
@ -41,6 +41,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||||||
final class PoolThreadCache {
|
final class PoolThreadCache {
|
||||||
|
|
||||||
private static final InternalLogger logger = InternalLoggerFactory.getInstance(PoolThreadCache.class);
|
private static final InternalLogger logger = InternalLoggerFactory.getInstance(PoolThreadCache.class);
|
||||||
|
private static final int INTEGER_SIZE_MINUS_ONE = Integer.SIZE - 1;
|
||||||
|
|
||||||
final PoolArena<byte[]> heapArena;
|
final PoolArena<byte[]> heapArena;
|
||||||
final PoolArena<ByteBuffer> directArena;
|
final PoolArena<ByteBuffer> directArena;
|
||||||
@ -150,13 +151,9 @@ final class PoolThreadCache {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// val > 0
|
||||||
private static int log2(int val) {
|
private static int log2(int val) {
|
||||||
int res = 0;
|
return INTEGER_SIZE_MINUS_ONE - Integer.numberOfLeadingZeros(val);
|
||||||
while (val > 1) {
|
|
||||||
val >>= 1;
|
|
||||||
res++;
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -322,6 +319,7 @@ final class PoolThreadCache {
|
|||||||
|
|
||||||
private MemoryRegionCache<?> cacheForNormal(PoolArena<?> area, int normCapacity) {
|
private MemoryRegionCache<?> cacheForNormal(PoolArena<?> area, int normCapacity) {
|
||||||
if (area.isDirect()) {
|
if (area.isDirect()) {
|
||||||
|
// sizeClass == Normal => normCapacity >= pageSize => the shifted value > 0
|
||||||
int idx = log2(normCapacity >> numShiftsNormalDirect);
|
int idx = log2(normCapacity >> numShiftsNormalDirect);
|
||||||
return cache(normalDirectCaches, idx);
|
return cache(normalDirectCaches, idx);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user