Skip to content

Commit

Permalink
perf(java): fix fury input stream read slow (#1551)
Browse files Browse the repository at this point in the history
  • Loading branch information
chaokunyang authored Apr 20, 2024
1 parent 9fde397 commit f246aaf
Showing 1 changed file with 21 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -53,24 +53,15 @@ public int fillBuffer(int minFillSize) {
MemoryBuffer buffer = this.buffer;
byte[] heapMemory = buffer.getHeapMemory();
int offset = buffer.size();
int targetSize = offset + minFillSize;
if (targetSize > heapMemory.length) {
int newSize;
if (targetSize < BUFFER_GROW_STEP_THRESHOLD) {
newSize = targetSize << 2;
} else {
newSize = (int) (targetSize * 1.5);
}
byte[] newBuffer = new byte[newSize];
System.arraycopy(heapMemory, 0, newBuffer, 0, buffer.size());
buffer.initHeapBuffer(newBuffer, 0, buffer.size());
heapMemory = newBuffer;
if (offset + minFillSize > heapMemory.length) {
heapMemory = growBuffer(minFillSize, buffer);
}
try {
int read;
read = stream.read(heapMemory, offset, Math.min(stream.available(), heapMemory.length));
int len = heapMemory.length - offset;
read = stream.read(heapMemory, offset, len);
while (read < minFillSize) {
int newRead = stream.read(heapMemory, offset + read, minFillSize - read);
int newRead = stream.read(heapMemory, offset + read, len - read);
if (newRead < 0) {
throw new IndexOutOfBoundsException("No enough data in the stream " + stream);
}
Expand All @@ -83,6 +74,22 @@ public int fillBuffer(int minFillSize) {
}
}

private static byte[] growBuffer(int minFillSize, MemoryBuffer buffer) {
int newSize;
int targetSize = buffer.size() + minFillSize;
if (targetSize < BUFFER_GROW_STEP_THRESHOLD) {
newSize = targetSize << 2;
} else {
newSize = (int) (targetSize * 1.5);
}
byte[] newBuffer = new byte[newSize];
byte[] heapMemory = buffer.getHeapMemory();
System.arraycopy(heapMemory, 0, newBuffer, 0, buffer.size());
buffer.initHeapBuffer(newBuffer, 0, buffer.size());
heapMemory = newBuffer;
return heapMemory;
}

@Override
public void readTo(byte[] dst, int dstIndex, int len) {
MemoryBuffer buf = buffer;
Expand Down

0 comments on commit f246aaf

Please sign in to comment.