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]

Reply via email to