From 4363f2d74b8af198f78b08e10cd0b3ead48af590 Mon Sep 17 00:00:00 2001 From: Eugene Kliuchnikov Date: Sun, 7 May 2017 17:13:03 +0200 Subject: Speedup Java decoder. (#547) * geo corpus decodes ~5% faster * fetchlogs corpus decodes ~25% faster --- java/org/brotli/dec/Decode.java | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/java/org/brotli/dec/Decode.java b/java/org/brotli/dec/Decode.java index 7c515dd..c988760 100755 --- a/java/org/brotli/dec/Decode.java +++ b/java/org/brotli/dec/Decode.java @@ -759,18 +759,29 @@ final class Decode { state.runningState = COPY_LOOP; // fall through case COPY_LOOP: - for (; state.j < state.copyLength;) { - ringBuffer[state.pos] = - ringBuffer[(state.pos - state.distance) & ringBufferMask]; - // TODO: condense - state.metaBlockLength--; - state.j++; - if (state.pos++ == ringBufferMask) { - state.nextRunningState = COPY_LOOP; - state.bytesToWrite = state.ringBufferSize; - state.bytesWritten = 0; - state.runningState = WRITE; - break; + int src = (state.pos - state.distance) & ringBufferMask; + int dst = state.pos; + int copyLength = state.copyLength - state.j; + if ((src + copyLength < ringBufferMask) && (dst + copyLength < ringBufferMask)) { + for (int k = 0; k < copyLength; ++k) { + ringBuffer[dst++] = ringBuffer[src++]; + } + state.j += copyLength; + state.metaBlockLength -= copyLength; + state.pos += copyLength; + } else { + for (; state.j < state.copyLength;) { + ringBuffer[state.pos] = + ringBuffer[(state.pos - state.distance) & ringBufferMask]; + state.metaBlockLength--; + state.j++; + if (state.pos++ == ringBufferMask) { + state.nextRunningState = COPY_LOOP; + state.bytesToWrite = state.ringBufferSize; + state.bytesWritten = 0; + state.runningState = WRITE; + break; + } } } if (state.runningState == COPY_LOOP) { -- cgit v1.1