- 不,这显然是无法消除智能边界检查的结果。
我已经扩展了Marko Topolnik的基准测试:
@OutputTimeUnit(TimeUnit.NANOSECONDS)@BenchmarkMode(Mode.AverageTime)@OperationsPerInvocation(BCElimination.N)@Warmup(iterations = 5, time = 1)@Measurement(iterations = 10, time = 1)@State(Scope.Thread)@Threads(1)@Fork(2)public class BCElimination { public static final int N = 1024; private static final Unsafe U; private static final long INT_base; private static final long INT_SCALE; static { try { Field f = Unsafe.class.getDeclaredField("theUnsafe"); f.setAccessible(true); U = (Unsafe) f.get(null); } catch (Exception e) { throw new IllegalStateException(e); } INT_base = U.arraybaseOffset(int[].class); INT_SCALE = U.arrayIndexScale(int[].class); } private final int[] table = new int[BCElimination.N]; @Setup public void setUp() { final Random random = new Random(); for (int i=0; i<table.length; ++i) table[i] = random.nextInt(); } @GenerateMicroBenchmark public int normalIndex() { int result = 0; final int[] table = this.table; int x = 0; for (int i=0; i<=table.length-1; ++i) { x += i; final int j = x & (table.length-1); result ^= table[i] + j; } return result; } @GenerateMicroBenchmark public int maskedIndex() { int result = 0; final int[] table = this.table; int x = 0; for (int i=0; i<=table.length-1; ++i) { x += i; final int j = x & (table.length-1); result ^= i + table[j]; } return result; } @GenerateMicroBenchmark public int maskedIndexUnsafe() { int result = 0; final int[] table = this.table; long x = 0; for (int i=0; i<=table.length-1; ++i) { x += i * INT_SCALE; final long j = x & ((table.length-1) * INT_SCALE); result ^= i + U.getInt(table, INT_base + j); } return result; }}结果:
Benchmark Mean Mean error UnitsBCElimination.maskedIndex 1,235 0,004 ns/opBCElimination.maskedIndexUnsafe 1,092 0,007 ns/opBCElimination.normalIndex 1,071 0,008 ns/op
2.第二个问题是热点开发邮件列表,而不是恕我直言的StackOverflow。



