Make ByteCursors from CompositeBuf slightly faster

This commit is contained in:
Chris Vest 2020-12-07 16:00:45 +01:00
parent a7701c04b5
commit 4960e8b3e7

View File

@ -329,25 +329,31 @@ final class CompositeBuf extends RcSupport<Buf, CompositeBuf> implements Buf {
int index = fromOffset; int index = fromOffset;
final int end = fromOffset + length; final int end = fromOffset + length;
int bufferIndex = startBufferIndex; int bufferIndex = startBufferIndex;
int initOffset = startCursor.currentOffset();
ByteCursor cursor = startCursor; ByteCursor cursor = startCursor;
long longValue = -1; long longValue = -1;
byte byteValue = -1; byte byteValue = -1;
@Override @Override
public boolean readLong() { public boolean readLong() {
if (bytesLeft() >= Long.BYTES) {
if (cursor.readLong()) { if (cursor.readLong()) {
longValue = cursor.getLong(); longValue = cursor.getLong();
index += Long.BYTES; return true;
} else {
longValue = nextLongFromBytes(); // Leave index increments to 'readByte'
} }
if (bytesLeft() >= Long.BYTES) {
longValue = nextLongFromBytes();
return true; return true;
} }
return false; return false;
} }
private long nextLongFromBytes() { private long nextLongFromBytes() {
if (cursor.bytesLeft() == 0) {
nextCursor();
if (cursor.readLong()) {
return cursor.getLong();
}
}
long val = 0; long val = 0;
for (int i = 0; i < 8; i++) { for (int i = 0; i < 8; i++) {
readByte(); readByte();
@ -364,20 +370,26 @@ final class CompositeBuf extends RcSupport<Buf, CompositeBuf> implements Buf {
@Override @Override
public boolean readByte() { public boolean readByte() {
if (index < end) { if (cursor.readByte()) {
if (!cursor.readByte()) { byteValue = cursor.getByte();
bufferIndex++; return true;
Buf nextBuf = bufs[bufferIndex]; }
cursor = nextBuf.openCursor(0, Math.min(nextBuf.capacity(), bytesLeft())); if (bytesLeft() > 0) {
cursor.readByte(); nextCursor();
} cursor.readByte();
byteValue = cursor.getByte(); byteValue = cursor.getByte();
index++;
return true; return true;
} }
return false; return false;
} }
private void nextCursor() {
bufferIndex++;
Buf nextBuf = bufs[bufferIndex];
cursor = nextBuf.openCursor(0, Math.min(nextBuf.capacity(), bytesLeft()));
initOffset = 0;
}
@Override @Override
public byte getByte() { public byte getByte() {
return byteValue; return byteValue;
@ -385,12 +397,15 @@ final class CompositeBuf extends RcSupport<Buf, CompositeBuf> implements Buf {
@Override @Override
public int currentOffset() { public int currentOffset() {
int currOff = cursor.currentOffset();
index += currOff - initOffset;
initOffset = currOff;
return index; return index;
} }
@Override @Override
public int bytesLeft() { public int bytesLeft() {
return end - index; return end - currentOffset();
} }
}; };
} }
@ -415,25 +430,31 @@ final class CompositeBuf extends RcSupport<Buf, CompositeBuf> implements Buf {
int index = fromOffset; int index = fromOffset;
final int end = fromOffset - length; final int end = fromOffset - length;
int bufferIndex = startBufferIndex; int bufferIndex = startBufferIndex;
int initOffset = startCursor.currentOffset();
ByteCursor cursor = startCursor; ByteCursor cursor = startCursor;
long longValue = -1; long longValue = -1;
byte byteValue = -1; byte byteValue = -1;
@Override @Override
public boolean readLong() { public boolean readLong() {
if (bytesLeft() >= Long.BYTES) {
if (cursor.readLong()) { if (cursor.readLong()) {
index -= Long.BYTES;
longValue = cursor.getLong(); longValue = cursor.getLong();
} else { return true;
longValue = nextLongFromBytes(); // Leave index increments to 'readByte'
} }
if (bytesLeft() >= Long.BYTES) {
longValue = nextLongFromBytes();
return true; return true;
} }
return false; return false;
} }
private long nextLongFromBytes() { private long nextLongFromBytes() {
if (cursor.bytesLeft() == 0) {
nextCursor();
if (cursor.readLong()) {
return cursor.getLong();
}
}
long val = 0; long val = 0;
for (int i = 0; i < 8; i++) { for (int i = 0; i < 8; i++) {
readByte(); readByte();
@ -450,21 +471,28 @@ final class CompositeBuf extends RcSupport<Buf, CompositeBuf> implements Buf {
@Override @Override
public boolean readByte() { public boolean readByte() {
if (index > end) { if (cursor.readByte()) {
if (!cursor.readByte()) { byteValue = cursor.getByte();
bufferIndex--; return true;
Buf nextBuf = bufs[bufferIndex]; }
int length = Math.min(nextBuf.capacity(), bytesLeft()); if (bytesLeft() > 0) {
cursor = nextBuf.openReverseCursor(nextBuf.capacity() - 1, length); nextCursor();
cursor.readByte(); cursor.readByte();
}
byteValue = cursor.getByte(); byteValue = cursor.getByte();
index--;
return true; return true;
} }
return false; return false;
} }
private void nextCursor() {
bufferIndex--;
Buf nextBuf = bufs[bufferIndex];
int length = Math.min(nextBuf.capacity(), bytesLeft());
int offset = nextBuf.capacity() - 1;
cursor = nextBuf.openReverseCursor(offset, length);
initOffset = offset;
}
@Override @Override
public byte getByte() { public byte getByte() {
return byteValue; return byteValue;
@ -472,12 +500,15 @@ final class CompositeBuf extends RcSupport<Buf, CompositeBuf> implements Buf {
@Override @Override
public int currentOffset() { public int currentOffset() {
int currOff = cursor.currentOffset();
index -= initOffset - currOff;
initOffset = currOff;
return index; return index;
} }
@Override @Override
public int bytesLeft() { public int bytesLeft() {
return index - end; return currentOffset() - end;
} }
}; };
} }