aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Kliuchnikov <eustas@google.com>2017-05-07 17:13:03 +0200
committerGitHub <noreply@github.com>2017-05-07 17:13:03 +0200
commit4363f2d74b8af198f78b08e10cd0b3ead48af590 (patch)
treedeafedbb03c5ce2262dd06b41f49ea53a0a19686
parenta015b426832a5d7a0bec500b7a8b1ae9fcd0c6d0 (diff)
downloadbrotli-4363f2d74b8af198f78b08e10cd0b3ead48af590.zip
brotli-4363f2d74b8af198f78b08e10cd0b3ead48af590.tar.gz
brotli-4363f2d74b8af198f78b08e10cd0b3ead48af590.tar.bz2
Speedup Java decoder. (#547)
* geo corpus decodes ~5% faster * fetchlogs corpus decodes ~25% faster
-rwxr-xr-xjava/org/brotli/dec/Decode.java35
1 files 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) {