Unsafe.{get,put}-X-Unaligned performance
Peter Levart
peter.levart at gmail.com
Thu Mar 12 22:05:36 UTC 2015
On 03/12/2015 10:04 PM, Peter Levart wrote:
> ... putLongUnaligned in the style of above getLongUnaligned is more
> tricky with current code structure. But there may be a middle ground
> (or a sweet spot):
>
>
> public final void putLongUnaligned(Object o, long offset, long x) {
> if (((int) offset & 1) == 1) {
> putLongParts(o, offset,
> (byte) (x >>> 0),
> (short) (x >>> 8),
> (short) (x >>> 24),
> (short) (x >>> 40),
> (byte) (x >>> 56));
> } else if (((int) offset & 2) == 2) {
> putLongParts(o, offset,
> (short)(x >>> 0),
> (int)(x >>> 16),
> (short)(x >>> 48));
> } else if (((int) offset & 4) == 4) {
> putLongParts(o, offset,
> (int)(x >> 0),
> (int)(x >>> 32));
> } else {
> putLong(o, offset, x);
> }
> }
>
>
> ...this has the same number of branches, but less instructions. You
> also need the following two:
At least on Intel (with -XX:-UseUnalignedAccesses) above code
(Unaligned2) is not any faster then your code (Unaligned) according to a
JMH random-access test. Neither is the reversal of if/else branches
(Unaligned1). Unaligned3 is switch-based variant (just get) and is
slowest. Your variant seems to be the fastest by a hair:
Benchmark Mode Samples Score Score
error Units
j.t.UnalignedTest.getLongUnaligned avgt 5 16.375
0.837 ns/op
j.t.UnalignedTest.getLongUnaligned1 avgt 5 18.340
0.617 ns/op
j.t.UnalignedTest.getLongUnaligned2 avgt 5 16.784
0.969 ns/op
j.t.UnalignedTest.getLongUnaligned3 avgt 5 19.634
0.871 ns/op
j.t.UnalignedTest.putLongUnaligned avgt 5 15.521
0.589 ns/op
j.t.UnalignedTest.putLongUnaligned1 avgt 5 16.676
1.042 ns/op
j.t.UnalignedTest.putLongUnaligned2 avgt 5 16.394
3.028 ns/op
Regards, Peter
Peter
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20150312/e220815e/attachment-0001.html>
More information about the hotspot-compiler-dev
mailing list