Class UnsafeChunkDecoder


  • public class UnsafeChunkDecoder
    extends ChunkDecoder
    Highly optimized ChunkDecoder implementation that uses Sun JDK's Unsafe class (which may be included by other JDK's as well; IBM's apparently does).

    Credits for the idea go to Dain Sundstrom, who kindly suggested this use, and is all-around great source for optimization tips and tricks. Big thanks also to LZ4-java developers, whose stellar performance made me go back and see what more I can do to optimize this code!

    • Field Detail

      • unsafe

        private static final sun.misc.Unsafe unsafe
      • BYTE_ARRAY_OFFSET

        private static final long BYTE_ARRAY_OFFSET
    • Constructor Detail

      • UnsafeChunkDecoder

        public UnsafeChunkDecoder()
    • Method Detail

      • decodeChunk

        public final int decodeChunk​(java.io.InputStream is,
                                     byte[] inputBuffer,
                                     byte[] outputBuffer)
                              throws java.io.IOException
        Description copied from class: ChunkDecoder
        Main decode from a stream. Decompressed bytes are placed in the outputBuffer, inputBuffer is a "scratch-area".
        Specified by:
        decodeChunk in class ChunkDecoder
        Parameters:
        is - An input stream of LZF compressed bytes
        inputBuffer - A byte array used as a scratch area.
        outputBuffer - A byte array in which the result is returned
        Returns:
        The number of bytes placed in the outputBuffer.
        Throws:
        java.io.IOException
      • skipOrDecodeChunk

        public int skipOrDecodeChunk​(java.io.InputStream is,
                                     byte[] inputBuffer,
                                     byte[] outputBuffer,
                                     long maxToSkip)
                              throws java.io.IOException
        Specified by:
        skipOrDecodeChunk in class ChunkDecoder
        Returns:
        If positive number, number of bytes skipped; if -1, end-of-stream was reached; otherwise, amount of content decoded (using formula of returnValue = -(decodedAmount + 2))
        Throws:
        java.io.IOException
      • copyOverlappingShort

        private final int copyOverlappingShort​(byte[] out,
                                               int outPos,
                                               int offset,
                                               int len)
      • copyOverlappingLong

        private static final int copyOverlappingLong​(byte[] out,
                                                     int outPos,
                                                     int offset,
                                                     int len)
      • copyUpTo32

        private static final void copyUpTo32​(byte[] buffer,
                                             int inputIndex,
                                             int outputIndex,
                                             int lengthMinusOne)
      • copyUpTo32

        private static final void copyUpTo32​(byte[] in,
                                             int inputIndex,
                                             byte[] out,
                                             int outputIndex,
                                             int lengthMinusOne)
      • copyLong

        private static final void copyLong​(byte[] buffer,
                                           int inputIndex,
                                           int outputIndex,
                                           int length,
                                           int outputEnd8)
      • copyLongTail

        private static final void copyLongTail​(byte[] buffer,
                                               int inputIndex,
                                               int outputIndex,
                                               int length)