[ https://issues.apache.org/jira/browse/HBASE-20716?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16524578#comment-16524578 ]
Sahil Aggarwal commented on HBASE-20716: ---------------------------------------- Here's small benchmark for Bytes.toShort @Benchmark public void testGetShortCheckAndDispatch() { if (UNSAFE_UNALIGNED) { UnsafeAccess.toShort(bytes, 0); } else { getShort(bytes, 0); } } @Benchmark public void testGetShortDispatch() { UnsafeAccess.toShort(bytes, 0); } private short getShort(byte[] bytes, int offset) { short n = 0; n = (short) ((n ^ bytes[offset]) & 0xFF); n = (short) (n << 8); n = (short) ((n ^ bytes[offset+1]) & 0xFF); return n; } Benchmark Mode Cnt Score Error Units UnsafeAccessBenchmark.testGetShortCheckAndDispatch thrpt 4 2195811074.302 ops/s UnsafeAccessBenchmark.testGetShortDispatch thrpt 4 2196669275.206 ops/s Was curious on affect on inlining too, disabling the inlining on UnsafeAccess.toShort: Benchmark Mode Cnt Score Error Units UnsafeAccessBenchmark.testGetShortCheckAndDispatch thrpt 2 474847927.534 ops/s UnsafeAccessBenchmark.testGetShortDispatch thrpt 2 486521295.364 ops/s ~ 78% reduction on disabling inlining. And, size difference b/w these methods: org.sample.UnsafeAccessBenchmark::testGetShortCheckAndDispatch (27 bytes) force inline by CompileOracle org.sample.UnsafeAccessBenchmark::testGetShortDispatch (9 bytes) force inline by CompileOracle > Unsafe access cleanup > --------------------- > > Key: HBASE-20716 > URL: https://issues.apache.org/jira/browse/HBASE-20716 > Project: HBase > Issue Type: Improvement > Components: Performance > Reporter: stack > Priority: Critical > Labels: beginner > Attachments: Screen Shot 2018-06-26 at 11.37.49 AM.png > > > We have two means of getting at unsafe; UnsafeAccess and then internal to the > Bytes class. They are effectively doing the same thing. We should have one > avenue to Unsafe only. > Many of our paths to Unsafe via UnsafeAccess traverse flags to check if > access is available, if it is aligned and the order in which words are > written on the machine. Each check costs -- especially if done millions of > times a second -- and on occasion adds bloat in hot code paths. The unsafe > access inside Bytes checks on startup what the machine is capable off and > then does a static assign of the appropriate class-to-use from there on out. > UnsafeAccess does not do this running the checks everytime. Would be good to > have the Bytes behavior pervasive. > The benefit of one access to Unsafe only is plain. The benefits we gain > removing checks will be harder to measure though should be plain when you > disassemble a hot-path; in a (very) rare case, the saved byte codes could be > the difference between inlining or not. -- This message was sent by Atlassian JIRA (v7.6.3#76005)