This is an automated email from the ASF dual-hosted git repository.
wangweipeng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-fury.git
The following commit(s) were added to refs/heads/main by this push:
new f246aafc perf(java): fix fury input stream read slow (#1551)
f246aafc is described below
commit f246aafc920455f6e65dd898b0ab31c0be3f6cc1
Author: Shawn Yang <[email protected]>
AuthorDate: Sat Apr 20 14:40:36 2024 +0800
perf(java): fix fury input stream read slow (#1551)
---
.../java/org/apache/fury/io/FuryInputStream.java | 35 +++++++++++++---------
1 file changed, 21 insertions(+), 14 deletions(-)
diff --git
a/java/fury-core/src/main/java/org/apache/fury/io/FuryInputStream.java
b/java/fury-core/src/main/java/org/apache/fury/io/FuryInputStream.java
index 4b81de9b..87cf82f5 100644
--- a/java/fury-core/src/main/java/org/apache/fury/io/FuryInputStream.java
+++ b/java/fury-core/src/main/java/org/apache/fury/io/FuryInputStream.java
@@ -53,24 +53,15 @@ public class FuryInputStream extends InputStream implements
FuryStreamReader {
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);
}
@@ -83,6 +74,22 @@ public class FuryInputStream extends InputStream implements
FuryStreamReader {
}
}
+ 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;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]