VarHandles & LMAX Disruptor
Michael Barker
mikeb01 at gmail.com
Tue Aug 4 21:25:12 UTC 2015
Hi John,
> 5) return (E) entries[mapSequenceToIndex(sequence, entries.length >> 1)
> & entries.length];
>
> where the following method may or may not be hand-inlined:
>
> static int mapSequenceToIndex(long sequence, int logicalLength) {
> return sequence & (logicalLength-1) + BUFFER_PAD;
> }
>
> Season to taste… The point is that the JIT sees any random int expression,
> followed by "& entries.length", which is enough to elide the range check.
>
Thanks, I'll give that approach a try. While it retains the padding on the
array entries it is lost for entries.length, so while it won't share a
cache line with the array entries it could share it with some other random
unknown thing. I still have to run some more tests to see what the actual
costs end up being. I suspect that I'll just suck up the cost of the
bounds checking, given that the Disruptor's focus is predictable latency
the overhead of a few additional instructions and an always correctly
predicted branch is probably better than occasional cache misses.
Mike.
More information about the valhalla-dev
mailing list