You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fury.apache.org by ch...@apache.org on 2024/04/13 10:43:23 UTC

(incubator-fury) branch main updated: perf(java): fastpath for read/write small varint in range [0,127] (#1503)

This is an automated email from the ASF dual-hosted git repository.

chaokunyang 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 27aa58bb perf(java): fastpath for read/write small varint in range [0,127] (#1503)
27aa58bb is described below

commit 27aa58bbfe91036b1e0cddbadbe0d17dc6a629f0
Author: Shawn Yang <sh...@gmail.com>
AuthorDate: Sat Apr 13 18:43:19 2024 +0800

    perf(java): fastpath for read/write small varint in range [0,127] (#1503)
    
    ## What does this PR do?
    This PR add fastpath for read/write small varint in range `[0,127]`.
    
    This PR also fix wrong log level setting in #1492
    <!-- Describe the purpose of this PR. -->
    
    
    ## Related issues
    
    <!--
    Is there any related issue? Please attach here.
    
    - #xxxx0
    - #xxxx1
    - #xxxx2
    -->
    
    
    ## Does this PR introduce any user-facing change?
    
    <!--
    If any user-facing interface changes, please [open an
    issue](https://github.com/apache/incubator-fury/issues/new/choose)
    describing the need to do so and update the document if necessary.
    -->
    
    - [ ] Does this PR introduce any public API change?
    - [ ] Does this PR introduce any binary protocol compatibility change?
    
    
    ## Benchmark
    With this PR:
    
    ![image](https://github.com/apache/incubator-fury/assets/12445254/7ed6f885-9547-414a-a5c4-fd4e77487248)
    
    Before this PR:
    
    ![image](https://github.com/apache/incubator-fury/assets/12445254/08a39519-cb0d-4992-8faf-8957842e8473)
    
    
    <!--
    When the PR has an impact on performance (if you don't know whether the
    PR will have an impact on performance, you can submit the PR first, and
    if it will have impact on performance, the code reviewer will explain
    it), be sure to attach a benchmark data here.
    -->
---
 .../org/apache/fury/logging/LoggerFactory.java     |   4 +-
 .../java/org/apache/fury/memory/MemoryBuffer.java  | 156 +++++++++++++--------
 .../org/apache/fury/resolver/ClassResolver.java    |  16 +--
 .../org/apache/fury/resolver/MapRefResolver.java   |   4 +-
 .../apache/fury/serializer/ArraySerializers.java   |  34 ++---
 .../fury/serializer/PrimitiveSerializers.java      |   2 +-
 .../org/apache/fury/serializer/Serializers.java    |  20 +--
 .../apache/fury/serializer/StringSerializer.java   |   2 +-
 .../collection/AbstractCollectionSerializer.java   |   4 +-
 .../collection/AbstractMapSerializer.java          |   2 +-
 .../collection/ChildContainerSerializers.java      |   4 +-
 .../collection/CollectionSerializer.java           |   2 +-
 .../collection/CollectionSerializers.java          |  44 +++---
 .../collection/FuryArrayAsListSerializer.java      |   2 +-
 .../collection/GuavaCollectionSerializers.java     |  20 +--
 .../collection/ImmutableCollectionSerializers.java |   6 +-
 .../fury/serializer/collection/MapSerializer.java  |   2 +-
 .../fury/serializer/collection/MapSerializers.java |  28 ++--
 .../main/java/org/apache/fury/type/ClassDef.java   |  12 +-
 .../org/apache/fury/memory/MemoryBufferTest.java   |  17 +++
 .../serializer/scala/CollectionSerializer.scala    |   6 +-
 .../fury/serializer/scala/MapSerializer.scala      |   4 +-
 22 files changed, 221 insertions(+), 170 deletions(-)

diff --git a/java/fury-core/src/main/java/org/apache/fury/logging/LoggerFactory.java b/java/fury-core/src/main/java/org/apache/fury/logging/LoggerFactory.java
index 7dd63d48..408f9c78 100644
--- a/java/fury-core/src/main/java/org/apache/fury/logging/LoggerFactory.java
+++ b/java/fury-core/src/main/java/org/apache/fury/logging/LoggerFactory.java
@@ -27,7 +27,7 @@ import org.apache.fury.util.GraalvmSupport;
 public class LoggerFactory {
   private static volatile boolean disableLogging;
   private static volatile boolean useSlf4jlogger;
-  private static volatile int logLevel;
+  private static volatile int logLevel = 2;
 
   public static void disableLogging() {
     disableLogging = true;
@@ -47,7 +47,7 @@ public class LoggerFactory {
 
   public static Logger getLogger(Class<?> clazz) {
     if (disableLogging) {
-      return new NilLogger();
+      return new FuryLogger(clazz, logLevel);
     } else {
       if (GraalvmSupport.IN_GRAALVM_NATIVE_IMAGE || !useSlf4jlogger) {
         return new FuryLogger(clazz, logLevel);
diff --git a/java/fury-core/src/main/java/org/apache/fury/memory/MemoryBuffer.java b/java/fury-core/src/main/java/org/apache/fury/memory/MemoryBuffer.java
index 7bc0a0c8..725eb0fe 100644
--- a/java/fury-core/src/main/java/org/apache/fury/memory/MemoryBuffer.java
+++ b/java/fury-core/src/main/java/org/apache/fury/memory/MemoryBuffer.java
@@ -731,7 +731,23 @@ public final class MemoryBuffer {
    */
   public int writeVarInt32(int v) {
     ensure(writerIndex + 8);
-    return _unsafeWriteVarInt32(v);
+    int varintBytes = _unsafePutVarUint36Small(writerIndex, ((long) v << 1) ^ (v >> 31));
+    writerIndex += varintBytes;
+    return varintBytes;
+  }
+
+  /**
+   * For implementation efficiency, this method needs at most 8 bytes for writing 5 bytes using long
+   * to avoid using two memory operations.
+   */
+  @CodegenInvoke
+  // CHECKSTYLE.OFF:MethodName
+  public int _unsafeWriteVarInt32(int v) {
+    // CHECKSTYLE.ON:MethodName
+    // Ensure negatives close to zero is encode in little bytes.
+    int varintBytes = _unsafePutVarUint36Small(writerIndex, ((long) v << 1) ^ (v >> 31));
+    writerIndex += varintBytes;
+    return varintBytes;
   }
 
   /**
@@ -744,20 +760,9 @@ public final class MemoryBuffer {
     // generated code is smaller. Otherwise, `MapRefResolver.writeRefOrNull`
     // may be `callee is too large`/`already compiled into a big method`
     ensure(writerIndex + 8);
-    return _unsafeWriteVarUint32(v);
-  }
-
-  /**
-   * For implementation efficiency, this method needs at most 8 bytes for writing 5 bytes using long
-   * to avoid using two memory operations.
-   */
-  @CodegenInvoke
-  // CHECKSTYLE.OFF:MethodName
-  public int _unsafeWriteVarInt32(int v) {
-    // CHECKSTYLE.ON:MethodName
-    // Ensure negatives close to zero is encode in little bytes.
-    v = (v << 1) ^ (v >> 31);
-    return _unsafeWriteVarUint32(v);
+    int varintBytes = _unsafePutVarUint36Small(writerIndex, v);
+    writerIndex += varintBytes;
+    return varintBytes;
   }
 
   /**
@@ -772,6 +777,33 @@ public final class MemoryBuffer {
     return varintBytes;
   }
 
+  /**
+   * Fast method for write an unsigned varint which is mostly a small value in 7 bits value in [0,
+   * 127). When the value is equal or greater than 127, the write will be a little slower.
+   */
+  public int writeVarUint32Small7(int value) {
+    ensure(writerIndex + 8);
+    if (value >>> 7 == 0) {
+      UNSAFE.putByte(heapMemory, address + writerIndex++, (byte) value);
+      return 1;
+    }
+    return continueWriteVarUint32Small7(value);
+  }
+
+  private int continueWriteVarUint32Small7(int value) {
+    long encoded = (value & 0x7F);
+    encoded |= (((value & 0x3f80) << 1) | 0x80);
+    int writerIdx = writerIndex;
+    if (value >>> 14 == 0) {
+      _unsafePutInt32(writerIdx, (int) encoded);
+      writerIndex += 2;
+      return 2;
+    }
+    int diff = continuePutVarInt36(writerIdx, encoded, value);
+    writerIndex += diff;
+    return diff;
+  }
+
   /**
    * Caller must ensure there must be at least 8 bytes for writing, otherwise the crash may occur.
    */
@@ -1011,16 +1043,14 @@ public final class MemoryBuffer {
    */
   public int writeVarInt64(long value) {
     ensure(writerIndex + 9);
-    value = (value << 1) ^ (value >> 63);
-    return _unsafeWriteVarUint64(value);
+    return _unsafeWriteVarUint64((value << 1) ^ (value >> 63));
   }
 
   @CodegenInvoke
   // CHECKSTYLE.OFF:MethodName
-  public int _unsafeWriteVarInt3264(long value) {
+  public int _unsafeWriteVarInt64(long value) {
     // CHECKSTYLE.ON:MethodName
-    value = (value << 1) ^ (value >> 63);
-    return _unsafeWriteVarUint64(value);
+    return _unsafeWriteVarUint64((value << 1) ^ (value >> 63));
   }
 
   public int writeVarUint64(long value) {
@@ -1167,8 +1197,7 @@ public final class MemoryBuffer {
     int idx = writerIndex;
     ensure(idx + 5 + numBytes);
     idx += _unsafeWriteVarUint32(numBytes);
-    final long destAddr = address + idx;
-    Platform.copyMemory(arr, offset, heapMemory, destAddr, numBytes);
+    Platform.copyMemory(arr, offset, heapMemory, address + idx, numBytes);
     writerIndex = idx + numBytes;
   }
 
@@ -1177,8 +1206,7 @@ public final class MemoryBuffer {
     final int writerIdx = writerIndex;
     final int newIdx = writerIdx + numBytes;
     ensure(newIdx);
-    final long destAddr = address + writerIdx;
-    Platform.copyMemory(arr, offset, heapMemory, destAddr, numBytes);
+    Platform.copyMemory(arr, offset, heapMemory, address + writerIdx, numBytes);
     writerIndex = newIdx;
   }
 
@@ -1186,8 +1214,7 @@ public final class MemoryBuffer {
     final int writerIdx = writerIndex;
     final int newIdx = writerIdx + numBytes;
     ensure(newIdx);
-    final long destAddr = address + writerIdx;
-    Platform.copyMemory(arr, offset, heapMemory, destAddr, numBytes);
+    Platform.copyMemory(arr, offset, heapMemory, address + writerIdx, numBytes);
     writerIndex = newIdx;
   }
 
@@ -1601,7 +1628,7 @@ public final class MemoryBuffer {
     int readIdx = readerIndex;
     int result;
     if (size - readIdx < 5) {
-      result = readVarUint32Slow();
+      result = (int) readVarUint36Slow();
     } else {
       long address = this.address;
       // | 1bit + 7bits | 1bit + 7bits | 1bit + 7bits | 1bit + 7bits |
@@ -1644,7 +1671,7 @@ public final class MemoryBuffer {
     int readIdx = readerIndex;
     int result;
     if (size - readIdx < 5) {
-      result = readVarUint32Slow();
+      result = (int) readVarUint36Slow();
     } else {
       long address = this.address;
       int fourByteValue = Integer.reverseBytes(UNSAFE.getInt(heapMemory, address + readIdx));
@@ -1750,7 +1777,7 @@ public final class MemoryBuffer {
   public int readVarUint32() {
     int readIdx = readerIndex;
     if (size - readIdx < 5) {
-      return readVarUint32Slow();
+      return (int) readVarUint36Slow();
     }
     // | 1bit + 7bits | 1bit + 7bits | 1bit + 7bits | 1bit + 7bits |
     int fourByteValue = _unsafeGetInt32(readIdx);
@@ -1783,55 +1810,62 @@ public final class MemoryBuffer {
   }
 
   /**
-   * Fast path for read a unsigned varint which is mostly a smaller value in [0, 16384). When the
-   * value is equal or greater than 16384, the read will be a little slower.
+   * Fast method for read an unsigned varint which is mostly a small value in 7 bits value in [0,
+   * 127). When the value is equal or greater than 127, the read will be a little slower.
+   */
+  public int readVarUint32Small7() {
+    int readIdx = readerIndex;
+    if (size - readIdx > 0) {
+      byte v = UNSAFE.getByte(heapMemory, address + readIdx++);
+      if ((v & 0x80) == 0) {
+        readerIndex = readIdx;
+        return v;
+      }
+    }
+    return readVarUint32Small14();
+  }
+
+  /**
+   * Fast path for read an unsigned varint which is mostly a small value in 14 bits value in [0,
+   * 16384). When the value is equal or greater than 16384, the read will be a little slower.
    */
-  public int readVarUintSmall() {
+  public int readVarUint32Small14() {
     int readIdx = readerIndex;
     if (size - readIdx >= 5) {
       int fourByteValue = _unsafeGetInt32(readIdx++);
-      int binarySize = fourByteValue & 0x7F;
+      int value = fourByteValue & 0x7F;
       // Duplicate and manual inline for performance.
       // noinspection Duplicates
       if ((fourByteValue & 0x80) != 0) {
         readIdx++;
-        binarySize |= (fourByteValue >>> 1) & 0x3f80;
+        value |= (fourByteValue >>> 1) & 0x3f80;
         if ((fourByteValue & 0x8000) != 0) {
           // merely executed path, make it as a separate method to reduce
           // code size of current method for better jvm inline
-          return continueRead(readIdx, fourByteValue, binarySize);
+          return continueReadVarUint32(readIdx, fourByteValue, value);
         }
       }
       readerIndex = readIdx;
-      return binarySize;
+      return value;
     } else {
-      return readVarUint32Slow();
+      return (int) readVarUint36Slow();
     }
   }
 
-  private int readVarUint32Slow() {
-    // Note:
-    //  Loop are not used here to improve performance,
-    //  we manually unroll the loop for better performance.
-    int b = readByte();
-    int result = b & 0x7F;
-    if ((b & 0x80) != 0) {
-      b = readByte();
-      result |= (b & 0x7F) << 7;
-      if ((b & 0x80) != 0) {
-        b = readByte();
-        result |= (b & 0x7F) << 14;
-        if ((b & 0x80) != 0) {
-          b = readByte();
-          result |= (b & 0x7F) << 21;
-          if ((b & 0x80) != 0) {
-            b = readByte();
-            result |= (b & 0x7F) << 28;
-          }
-        }
+  private int continueReadVarUint32(int readIdx, int bulkRead, int value) {
+    // Duplicate and manual inline for performance.
+    // noinspection Duplicates
+    readIdx++;
+    value |= (bulkRead >>> 2) & 0x1fc000;
+    if ((bulkRead & 0x800000) != 0) {
+      readIdx++;
+      value |= (bulkRead >>> 3) & 0xfe00000;
+      if ((bulkRead & 0x80000000) != 0) {
+        value |= (UNSAFE.getByte(heapMemory, address + readIdx++) & 0x7F) << 28;
       }
     }
-    return result;
+    readerIndex = readIdx;
+    return value;
   }
 
   /** Reads the 1-9 byte int part of a var long. */
@@ -2183,12 +2217,12 @@ public final class MemoryBuffer {
         if ((fourByteValue & 0x8000) != 0) {
           // merely executed path, make it as a separate method to reduce
           // code size of current method for better jvm inline
-          return continueRead(readIdx, fourByteValue, binarySize);
+          return continueReadBinarySize(readIdx, fourByteValue, binarySize);
         }
       }
       readerIndex = readIdx;
     } else {
-      binarySize = readVarUint32Slow();
+      binarySize = (int) readVarUint36Slow();
       readIdx = readerIndex;
     }
     int diff = size - readIdx;
@@ -2198,7 +2232,7 @@ public final class MemoryBuffer {
     return binarySize;
   }
 
-  private int continueRead(int readIdx, int bulkRead, int binarySize) {
+  private int continueReadBinarySize(int readIdx, int bulkRead, int binarySize) {
     // Duplicate and manual inline for performance.
     // noinspection Duplicates
     readIdx++;
diff --git a/java/fury-core/src/main/java/org/apache/fury/resolver/ClassResolver.java b/java/fury-core/src/main/java/org/apache/fury/resolver/ClassResolver.java
index 3c529958..84654e2a 100644
--- a/java/fury-core/src/main/java/org/apache/fury/resolver/ClassResolver.java
+++ b/java/fury-core/src/main/java/org/apache/fury/resolver/ClassResolver.java
@@ -1204,9 +1204,9 @@ public class ClassResolver {
   public void writeClassAndUpdateCache(MemoryBuffer buffer, Class<?> cls) {
     // fast path for common type
     if (cls == Integer.class) {
-      buffer.writeVarUint32(INTEGER_CLASS_ID << 1);
+      buffer.writeVarUint32Small7(INTEGER_CLASS_ID << 1);
     } else if (cls == Long.class) {
-      buffer.writeVarUint32(LONG_CLASS_ID << 1);
+      buffer.writeVarUint32Small7(LONG_CLASS_ID << 1);
     } else {
       writeClass(buffer, getOrUpdateClassInfo(cls));
     }
@@ -1290,7 +1290,7 @@ public class ClassResolver {
         metaContext,
         "Meta context must be set before serialization,"
             + " please set meta context by SerializationContext.setMetaContext");
-    int id = buffer.readVarUintSmall();
+    int id = buffer.readVarUint32Small14();
     List<ClassInfo> readClassInfos = metaContext.readClassInfos;
     ClassInfo classInfo = readClassInfos.get(id);
     if (classInfo == null) {
@@ -1313,7 +1313,7 @@ public class ClassResolver {
         metaContext,
         "Meta context must be set before serialization,"
             + " please set meta context by SerializationContext.setMetaContext");
-    int id = buffer.readVarUintSmall();
+    int id = buffer.readVarUint32Small14();
     List<ClassInfo> readClassInfos = metaContext.readClassInfos;
     ClassInfo classInfo = readClassInfos.get(id);
     if (classInfo == null) {
@@ -1380,7 +1380,7 @@ public class ClassResolver {
    */
   public void writeClassDefs(MemoryBuffer buffer) {
     MetaContext metaContext = fury.getSerializationContext().getMetaContext();
-    buffer.writeVarUint32(metaContext.writingClassDefs.size());
+    buffer.writeVarUint32Small7(metaContext.writingClassDefs.size());
     for (ClassDef classDef : metaContext.writingClassDefs) {
       classDef.writeClassDef(buffer);
     }
@@ -1397,7 +1397,7 @@ public class ClassResolver {
     int classDefOffset = buffer.readInt32();
     int readerIndex = buffer.readerIndex();
     buffer.readerIndex(classDefOffset);
-    int numClassDefs = buffer.readVarUintSmall();
+    int numClassDefs = buffer.readVarUint32Small14();
     for (int i = 0; i < numClassDefs; i++) {
       ClassDef readClassDef = ClassDef.readClassDef(buffer);
       // Share same class def to reduce memory footprint, since there may be many meta context.
@@ -1466,7 +1466,7 @@ public class ClassResolver {
 
   // Note: Thread safe fot jit thread to call.
   public Expression skipRegisteredClassExpr(Expression buffer) {
-    return new Invoke(buffer, "readVarUintSmall");
+    return new Invoke(buffer, "readVarUint32Small14");
   }
 
   /**
@@ -1580,7 +1580,7 @@ public class ClassResolver {
     // use classId
     if ((flag & 0x80) != 0) { // class id is written using multiple bytes.
       buffer.increaseReaderIndex(-1);
-      classId = (short) buffer.readVarUintSmall();
+      classId = (short) buffer.readVarUint32Small14();
     } else {
       classId = (short) (flag & 0x7F);
     }
diff --git a/java/fury-core/src/main/java/org/apache/fury/resolver/MapRefResolver.java b/java/fury-core/src/main/java/org/apache/fury/resolver/MapRefResolver.java
index 0ba31f38..efab1943 100644
--- a/java/fury-core/src/main/java/org/apache/fury/resolver/MapRefResolver.java
+++ b/java/fury-core/src/main/java/org/apache/fury/resolver/MapRefResolver.java
@@ -149,7 +149,7 @@ public final class MapRefResolver implements RefResolver {
     byte headFlag = buffer.readByte();
     if (headFlag == Fury.REF_FLAG) {
       // read reference id and get object from reference resolver
-      int referenceId = buffer.readVarUintSmall();
+      int referenceId = buffer.readVarUint32Small14();
       readObject = getReadObject(referenceId);
     } else {
       readObject = null;
@@ -170,7 +170,7 @@ public final class MapRefResolver implements RefResolver {
     byte headFlag = buffer.readByte();
     if (headFlag == Fury.REF_FLAG) {
       // read reference id and get object from reference resolver
-      readObject = getReadObject(buffer.readVarUintSmall());
+      readObject = getReadObject(buffer.readVarUint32Small14());
     } else {
       readObject = null;
       if (headFlag == Fury.REF_VALUE_FLAG) {
diff --git a/java/fury-core/src/main/java/org/apache/fury/serializer/ArraySerializers.java b/java/fury-core/src/main/java/org/apache/fury/serializer/ArraySerializers.java
index 565b0f1f..cf8790ed 100644
--- a/java/fury-core/src/main/java/org/apache/fury/serializer/ArraySerializers.java
+++ b/java/fury-core/src/main/java/org/apache/fury/serializer/ArraySerializers.java
@@ -82,7 +82,7 @@ public class ArraySerializers {
     @Override
     public void write(MemoryBuffer buffer, T[] arr) {
       int len = arr.length;
-      buffer.writeInt32(len);
+      buffer.writeVarUint32Small7(len);
       RefResolver refResolver = fury.getRefResolver();
       Serializer componentSerializer = this.componentTypeSerializer;
       if (componentSerializer != null) {
@@ -112,7 +112,7 @@ public class ArraySerializers {
     @Override
     public void xwrite(MemoryBuffer buffer, T[] arr) {
       int len = arr.length;
-      buffer.writeVarUint32(len);
+      buffer.writeVarUint32Small7(len);
       // TODO(chaokunyang) use generics by creating component serializers to multi-dimension array.
       for (T t : arr) {
         fury.xwriteRef(buffer, t);
@@ -122,7 +122,7 @@ public class ArraySerializers {
     @Override
     public T[] read(MemoryBuffer buffer) {
       // Some jdk8 will crash if use varint, why?
-      int numElements = buffer.readInt32();
+      int numElements = buffer.readVarUint32Small7();
       Object[] value = newArray(numElements);
       RefResolver refResolver = fury.getRefResolver();
       refResolver.reference(value);
@@ -160,7 +160,7 @@ public class ArraySerializers {
 
     @Override
     public T[] xread(MemoryBuffer buffer) {
-      int numElements = buffer.readVarUint32();
+      int numElements = buffer.readVarUint32Small7();
       Object[] value = newArray(numElements);
       for (int i = 0; i < numElements; i++) {
         value[i] = fury.xreadRef(buffer);
@@ -268,7 +268,7 @@ public class ArraySerializers {
         buf.copyToUnsafe(0, values, offset, size);
         return values;
       } else {
-        int size = buffer.readVarUint32();
+        int size = buffer.readVarUint32Small7();
         int numElements = size / elemSize;
         boolean[] values = new boolean[numElements];
         buffer.readToUnsafe(values, offset, size);
@@ -303,7 +303,7 @@ public class ArraySerializers {
         buf.copyToUnsafe(0, values, offset, size);
         return values;
       } else {
-        int size = buffer.readVarUint32();
+        int size = buffer.readVarUint32Small7();
         byte[] values = new byte[size];
         buffer.readToUnsafe(values, offset, size);
         return values;
@@ -338,7 +338,7 @@ public class ArraySerializers {
         buf.copyToUnsafe(0, values, offset, size);
         return values;
       } else {
-        int size = buffer.readVarUint32();
+        int size = buffer.readVarUint32Small7();
         int numElements = size / elemSize;
         char[] values = new char[numElements];
         buffer.readToUnsafe(values, offset, size);
@@ -389,7 +389,7 @@ public class ArraySerializers {
         buf.copyToUnsafe(0, values, offset, size);
         return values;
       } else {
-        int size = buffer.readVarUint32();
+        int size = buffer.readVarUint32Small7();
         int numElements = size / elemSize;
         short[] values = new short[numElements];
         buffer.readToUnsafe(values, offset, size);
@@ -425,7 +425,7 @@ public class ArraySerializers {
         buf.copyToUnsafe(0, values, offset, size);
         return values;
       } else {
-        int size = buffer.readVarUint32();
+        int size = buffer.readVarUint32Small7();
         int numElements = size / elemSize;
         int[] values = new int[numElements];
         buffer.readToUnsafe(values, offset, size);
@@ -461,7 +461,7 @@ public class ArraySerializers {
         buf.copyToUnsafe(0, values, offset, size);
         return values;
       } else {
-        int size = buffer.readVarUint32();
+        int size = buffer.readVarUint32Small7();
         int numElements = size / elemSize;
         long[] values = new long[numElements];
         buffer.readToUnsafe(values, offset, size);
@@ -497,7 +497,7 @@ public class ArraySerializers {
         buf.copyToUnsafe(0, values, offset, size);
         return values;
       } else {
-        int size = buffer.readVarUint32();
+        int size = buffer.readVarUint32Small7();
         int numElements = size / elemSize;
         float[] values = new float[numElements];
         buffer.readToUnsafe(values, offset, size);
@@ -533,7 +533,7 @@ public class ArraySerializers {
         buf.copyToUnsafe(0, values, offset, size);
         return values;
       } else {
-        int size = buffer.readVarUint32();
+        int size = buffer.readVarUint32Small7();
         int numElements = size / elemSize;
         double[] values = new double[numElements];
         buffer.readToUnsafe(values, offset, size);
@@ -563,7 +563,7 @@ public class ArraySerializers {
     @Override
     public void write(MemoryBuffer buffer, String[] value) {
       int len = value.length;
-      buffer.writeVarUint32(len);
+      buffer.writeVarUint32Small7(len);
       if (len == 0) {
         return;
       }
@@ -591,7 +591,7 @@ public class ArraySerializers {
 
     @Override
     public String[] read(MemoryBuffer buffer) {
-      int numElements = buffer.readVarUintSmall();
+      int numElements = buffer.readVarUint32Small7();
       String[] value = new String[numElements];
       if (numElements == 0) {
         return value;
@@ -615,7 +615,7 @@ public class ArraySerializers {
     @Override
     public void xwrite(MemoryBuffer buffer, String[] value) {
       int len = value.length;
-      buffer.writeVarUint32(len);
+      buffer.writeVarUint32Small7(len);
       for (String elem : value) {
         if (elem != null) {
           buffer.writeByte(Fury.REF_VALUE_FLAG);
@@ -628,7 +628,7 @@ public class ArraySerializers {
 
     @Override
     public String[] xread(MemoryBuffer buffer) {
-      int numElements = buffer.readVarUint32();
+      int numElements = buffer.readVarUint32Small7();
       String[] value = new String[numElements];
       for (int i = 0; i < numElements; i++) {
         if (buffer.readByte() == Fury.REF_VALUE_FLAG) {
@@ -660,7 +660,7 @@ public class ArraySerializers {
   static void writePrimitiveArray(
       MemoryBuffer buffer, Object arr, int offset, int numElements, int elemSize) {
     int size = Math.multiplyExact(numElements, elemSize);
-    buffer.writeVarUint32(size);
+    buffer.writeVarUint32Small7(size);
     int writerIndex = buffer.writerIndex();
     int end = writerIndex + size;
     buffer.ensure(end);
diff --git a/java/fury-core/src/main/java/org/apache/fury/serializer/PrimitiveSerializers.java b/java/fury-core/src/main/java/org/apache/fury/serializer/PrimitiveSerializers.java
index d0117be1..a8c5a36d 100644
--- a/java/fury-core/src/main/java/org/apache/fury/serializer/PrimitiveSerializers.java
+++ b/java/fury-core/src/main/java/org/apache/fury/serializer/PrimitiveSerializers.java
@@ -232,7 +232,7 @@ public class PrimitiveSerializers {
         case SLI:
           return new Invoke(buffer, ensureBounds ? "writeSliInt64" : "_unsafeWriteSliInt64", v);
         case PVL:
-          return new Invoke(buffer, ensureBounds ? "writeVarInt64" : "_unsafeWriteVarInt3264", v);
+          return new Invoke(buffer, ensureBounds ? "writeVarInt64" : "_unsafeWriteVarInt64", v);
         default:
           throw new UnsupportedOperationException("Unsupported long encoding " + longEncoding);
       }
diff --git a/java/fury-core/src/main/java/org/apache/fury/serializer/Serializers.java b/java/fury-core/src/main/java/org/apache/fury/serializer/Serializers.java
index 60aa0d53..fb4274b6 100644
--- a/java/fury-core/src/main/java/org/apache/fury/serializer/Serializers.java
+++ b/java/fury-core/src/main/java/org/apache/fury/serializer/Serializers.java
@@ -322,12 +322,12 @@ public class Serializers {
 
     @Override
     public void write(MemoryBuffer buffer, Enum value) {
-      buffer.writeVarUint32(value.ordinal());
+      buffer.writeVarUint32Small7(value.ordinal());
     }
 
     @Override
     public Enum read(MemoryBuffer buffer) {
-      return enumConstants[buffer.readVarUintSmall()];
+      return enumConstants[buffer.readVarUint32Small7()];
     }
   }
 
@@ -339,17 +339,17 @@ public class Serializers {
     @Override
     public void write(MemoryBuffer buffer, BigDecimal value) {
       final byte[] bytes = value.unscaledValue().toByteArray();
-      buffer.writeVarUint32(value.scale());
-      buffer.writeVarUint32(value.precision());
-      buffer.writeVarUint32(bytes.length);
+      buffer.writeVarUint32Small7(value.scale());
+      buffer.writeVarUint32Small7(value.precision());
+      buffer.writeVarUint32Small7(bytes.length);
       buffer.writeBytes(bytes);
     }
 
     @Override
     public BigDecimal read(MemoryBuffer buffer) {
-      int scale = buffer.readVarUint32();
-      int precision = buffer.readVarUint32();
-      int len = buffer.readVarUint32();
+      int scale = buffer.readVarUint32Small7();
+      int precision = buffer.readVarUint32Small7();
+      int len = buffer.readVarUint32Small7();
       byte[] bytes = buffer.readBytes(len);
       final BigInteger bigInteger = new BigInteger(bytes);
       return new BigDecimal(bigInteger, scale, new MathContext(precision));
@@ -364,13 +364,13 @@ public class Serializers {
     @Override
     public void write(MemoryBuffer buffer, BigInteger value) {
       final byte[] bytes = value.toByteArray();
-      buffer.writeVarUint32(bytes.length);
+      buffer.writeVarUint32Small7(bytes.length);
       buffer.writeBytes(bytes);
     }
 
     @Override
     public BigInteger read(MemoryBuffer buffer) {
-      int len = buffer.readVarUint32();
+      int len = buffer.readVarUint32Small7();
       byte[] bytes = buffer.readBytes(len);
       return new BigInteger(bytes);
     }
diff --git a/java/fury-core/src/main/java/org/apache/fury/serializer/StringSerializer.java b/java/fury-core/src/main/java/org/apache/fury/serializer/StringSerializer.java
index 71cb9a15..8fbc429a 100644
--- a/java/fury-core/src/main/java/org/apache/fury/serializer/StringSerializer.java
+++ b/java/fury-core/src/main/java/org/apache/fury/serializer/StringSerializer.java
@@ -646,7 +646,7 @@ public final class StringSerializer extends Serializer<String> {
   }
 
   public String readUTF8String(MemoryBuffer buffer) {
-    int numBytes = buffer.readVarUintSmall();
+    int numBytes = buffer.readVarUint32Small14();
     buffer.checkReadableBytes(numBytes);
     final byte[] targetArray = buffer.getHeapMemory();
     if (targetArray != null) {
diff --git a/java/fury-core/src/main/java/org/apache/fury/serializer/collection/AbstractCollectionSerializer.java b/java/fury-core/src/main/java/org/apache/fury/serializer/collection/AbstractCollectionSerializer.java
index faeb799c..e8a54b18 100644
--- a/java/fury-core/src/main/java/org/apache/fury/serializer/collection/AbstractCollectionSerializer.java
+++ b/java/fury-core/src/main/java/org/apache/fury/serializer/collection/AbstractCollectionSerializer.java
@@ -439,7 +439,7 @@ public abstract class AbstractCollectionSerializer<T> extends Serializer<T> {
   public void xwrite(MemoryBuffer buffer, T value) {
     Collection collection = (Collection) value;
     int len = collection.size();
-    buffer.writeVarUint32(len);
+    buffer.writeVarUint32Small7(len);
     xwriteElements(fury, buffer, collection);
   }
 
@@ -493,7 +493,7 @@ public abstract class AbstractCollectionSerializer<T> extends Serializer<T> {
    * will raise NPE.
    */
   public Collection newCollection(MemoryBuffer buffer) {
-    numElements = buffer.readVarUintSmall();
+    numElements = buffer.readVarUint32Small7();
     if (constructor == null) {
       constructor = ReflectionUtils.getCtrHandle(type, true);
     }
diff --git a/java/fury-core/src/main/java/org/apache/fury/serializer/collection/AbstractMapSerializer.java b/java/fury-core/src/main/java/org/apache/fury/serializer/collection/AbstractMapSerializer.java
index 63d90c24..ccadf32a 100644
--- a/java/fury-core/src/main/java/org/apache/fury/serializer/collection/AbstractMapSerializer.java
+++ b/java/fury-core/src/main/java/org/apache/fury/serializer/collection/AbstractMapSerializer.java
@@ -704,7 +704,7 @@ public abstract class AbstractMapSerializer<T> extends Serializer<T> {
    * will raise NPE.
    */
   public Map newMap(MemoryBuffer buffer) {
-    numElements = buffer.readVarUint32();
+    numElements = buffer.readVarUint32Small7();
     if (constructor == null) {
       constructor = ReflectionUtils.getCtrHandle(type, true);
     }
diff --git a/java/fury-core/src/main/java/org/apache/fury/serializer/collection/ChildContainerSerializers.java b/java/fury-core/src/main/java/org/apache/fury/serializer/collection/ChildContainerSerializers.java
index 9603b391..0678d2ee 100644
--- a/java/fury-core/src/main/java/org/apache/fury/serializer/collection/ChildContainerSerializers.java
+++ b/java/fury-core/src/main/java/org/apache/fury/serializer/collection/ChildContainerSerializers.java
@@ -136,7 +136,7 @@ public class ChildContainerSerializers {
 
     @Override
     public Collection onCollectionWrite(MemoryBuffer buffer, T value) {
-      buffer.writeVarUint32(value.size());
+      buffer.writeVarUint32Small7(value.size());
       for (Serializer slotsSerializer : slotsSerializers) {
         slotsSerializer.write(buffer, value);
       }
@@ -185,7 +185,7 @@ public class ChildContainerSerializers {
 
     @Override
     public Map onMapWrite(MemoryBuffer buffer, T value) {
-      buffer.writeVarUint32(value.size());
+      buffer.writeVarUint32Small7(value.size());
       for (Serializer slotsSerializer : slotsSerializers) {
         slotsSerializer.write(buffer, value);
       }
diff --git a/java/fury-core/src/main/java/org/apache/fury/serializer/collection/CollectionSerializer.java b/java/fury-core/src/main/java/org/apache/fury/serializer/collection/CollectionSerializer.java
index 862a1c25..511a5d91 100644
--- a/java/fury-core/src/main/java/org/apache/fury/serializer/collection/CollectionSerializer.java
+++ b/java/fury-core/src/main/java/org/apache/fury/serializer/collection/CollectionSerializer.java
@@ -36,7 +36,7 @@ public class CollectionSerializer<T extends Collection> extends AbstractCollecti
 
   @Override
   public Collection onCollectionWrite(MemoryBuffer buffer, T value) {
-    buffer.writeVarUint32(value.size());
+    buffer.writeVarUint32Small7(value.size());
     return value;
   }
 
diff --git a/java/fury-core/src/main/java/org/apache/fury/serializer/collection/CollectionSerializers.java b/java/fury-core/src/main/java/org/apache/fury/serializer/collection/CollectionSerializers.java
index 4061a6e3..40ad518c 100644
--- a/java/fury-core/src/main/java/org/apache/fury/serializer/collection/CollectionSerializers.java
+++ b/java/fury-core/src/main/java/org/apache/fury/serializer/collection/CollectionSerializers.java
@@ -71,7 +71,7 @@ public class CollectionSerializers {
 
     @Override
     public ArrayList newCollection(MemoryBuffer buffer) {
-      int numElements = buffer.readVarUintSmall();
+      int numElements = buffer.readVarUint32Small7();
       setNumElements(numElements);
       ArrayList arrayList = new ArrayList(numElements);
       fury.getRefResolver().reference(arrayList);
@@ -126,7 +126,7 @@ public class CollectionSerializers {
 
     @Override
     public List<?> xread(MemoryBuffer buffer) {
-      int numElements = buffer.readVarUint32();
+      int numElements = buffer.readVarUint32Small7();
       Object[] arr = new Object[numElements];
       for (int i = 0; i < numElements; i++) {
         Object elem = fury.xreadRef(buffer);
@@ -148,7 +148,7 @@ public class CollectionSerializers {
 
     @Override
     public HashSet newCollection(MemoryBuffer buffer) {
-      int numElements = buffer.readVarUint32();
+      int numElements = buffer.readVarUint32Small7();
       setNumElements(numElements);
       HashSet hashSet = new HashSet(numElements);
       fury.getRefResolver().reference(hashSet);
@@ -168,7 +168,7 @@ public class CollectionSerializers {
 
     @Override
     public LinkedHashSet newCollection(MemoryBuffer buffer) {
-      int numElements = buffer.readVarUint32();
+      int numElements = buffer.readVarUint32Small7();
       setNumElements(numElements);
       LinkedHashSet hashSet = new LinkedHashSet(numElements);
       fury.getRefResolver().reference(hashSet);
@@ -192,7 +192,7 @@ public class CollectionSerializers {
 
     @Override
     public Collection onCollectionWrite(MemoryBuffer buffer, T value) {
-      buffer.writeVarUint32(value.size());
+      buffer.writeVarUint32Small7(value.size());
       fury.writeRef(buffer, value.comparator());
       return value;
     }
@@ -200,7 +200,7 @@ public class CollectionSerializers {
     @SuppressWarnings("unchecked")
     @Override
     public T newCollection(MemoryBuffer buffer) {
-      int numElements = buffer.readVarUint32();
+      int numElements = buffer.readVarUint32Small7();
       setNumElements(numElements);
       T collection;
       Comparator comparator = (Comparator) fury.readRef(buffer);
@@ -240,7 +240,7 @@ public class CollectionSerializers {
     @Override
     public void xwrite(MemoryBuffer buffer, List<?> value) {
       // write length
-      buffer.writeVarUint32(0);
+      buffer.writeVarUint32Small7(0);
     }
 
     @Override
@@ -250,7 +250,7 @@ public class CollectionSerializers {
 
     @Override
     public List<?> xread(MemoryBuffer buffer) {
-      buffer.readVarUint32();
+      buffer.readVarUint32Small7();
       return Collections.EMPTY_LIST;
     }
   }
@@ -272,7 +272,7 @@ public class CollectionSerializers {
     @Override
     public void xwrite(MemoryBuffer buffer, Set<?> value) {
       // write length
-      buffer.writeVarUint32(0);
+      buffer.writeVarUint32Small7(0);
     }
 
     @Override
@@ -282,7 +282,7 @@ public class CollectionSerializers {
 
     @Override
     public Set<?> xread(MemoryBuffer buffer) {
-      buffer.readVarUint32();
+      buffer.readVarUint32Small7();
       return Collections.EMPTY_SET;
     }
   }
@@ -321,7 +321,7 @@ public class CollectionSerializers {
 
     @Override
     public void xwrite(MemoryBuffer buffer, List<?> value) {
-      buffer.writeVarUint32(1);
+      buffer.writeVarUint32Small7(1);
       fury.xwriteRef(buffer, value.get(0));
     }
 
@@ -332,7 +332,7 @@ public class CollectionSerializers {
 
     @Override
     public List<?> xread(MemoryBuffer buffer) {
-      buffer.readVarUint32();
+      buffer.readVarUint32Small7();
       return Collections.singletonList(fury.xreadRef(buffer));
     }
   }
@@ -355,7 +355,7 @@ public class CollectionSerializers {
 
     @Override
     public void xwrite(MemoryBuffer buffer, Set<?> value) {
-      buffer.writeVarUint32(1);
+      buffer.writeVarUint32Small7(1);
       fury.xwriteRef(buffer, value.iterator().next());
     }
 
@@ -366,7 +366,7 @@ public class CollectionSerializers {
 
     @Override
     public Set<?> xread(MemoryBuffer buffer) {
-      buffer.readVarUint32();
+      buffer.readVarUint32Small7();
       return Collections.singleton(fury.xreadRef(buffer));
     }
   }
@@ -380,7 +380,7 @@ public class CollectionSerializers {
 
     @Override
     public ConcurrentSkipListSet newCollection(MemoryBuffer buffer) {
-      int numElements = buffer.readVarUint32();
+      int numElements = buffer.readVarUint32Small7();
       setNumElements(numElements);
       Comparator comparator = (Comparator) fury.readRef(buffer);
       ConcurrentSkipListSet skipListSet = new ConcurrentSkipListSet(comparator);
@@ -397,7 +397,7 @@ public class CollectionSerializers {
 
     @Override
     public Vector newCollection(MemoryBuffer buffer) {
-      int numElements = buffer.readVarUint32();
+      int numElements = buffer.readVarUint32Small7();
       setNumElements(numElements);
       Vector<Object> vector = new Vector<>(numElements);
       fury.getRefResolver().reference(vector);
@@ -413,7 +413,7 @@ public class CollectionSerializers {
 
     @Override
     public ArrayDeque newCollection(MemoryBuffer buffer) {
-      int numElements = buffer.readVarUint32();
+      int numElements = buffer.readVarUint32Small7();
       setNumElements(numElements);
       ArrayDeque deque = new ArrayDeque(numElements);
       fury.getRefResolver().reference(deque);
@@ -442,7 +442,7 @@ public class CollectionSerializers {
       }
       fury.getClassResolver().writeClassAndUpdateCache(buffer, elemClass);
       Serializer serializer = fury.getClassResolver().getSerializer(elemClass);
-      buffer.writeVarUint32(object.size());
+      buffer.writeVarUint32Small7(object.size());
       for (Object element : object) {
         serializer.write(buffer, element);
       }
@@ -453,7 +453,7 @@ public class CollectionSerializers {
       Class elemClass = fury.getClassResolver().readClassInfo(buffer).getCls();
       EnumSet object = EnumSet.noneOf(elemClass);
       Serializer elemSerializer = fury.getClassResolver().getSerializer(elemClass);
-      int length = buffer.readVarUint32();
+      int length = buffer.readVarUint32Small7();
       for (int i = 0; i < length; i++) {
         object.add(elemSerializer.read(buffer));
       }
@@ -475,7 +475,7 @@ public class CollectionSerializers {
 
     @Override
     public BitSet read(MemoryBuffer buffer) {
-      long[] values = buffer.readLongs(buffer.readVarUint32());
+      long[] values = buffer.readLongs(buffer.readVarUint32Small7());
       return BitSet.valueOf(values);
     }
   }
@@ -486,14 +486,14 @@ public class CollectionSerializers {
     }
 
     public Collection onCollectionWrite(MemoryBuffer buffer, PriorityQueue value) {
-      buffer.writeVarUint32(value.size());
+      buffer.writeVarUint32Small7(value.size());
       fury.writeRef(buffer, value.comparator());
       return value;
     }
 
     @Override
     public PriorityQueue newCollection(MemoryBuffer buffer) {
-      int numElements = buffer.readVarUint32();
+      int numElements = buffer.readVarUint32Small7();
       setNumElements(numElements);
       Comparator comparator = (Comparator) fury.readRef(buffer);
       PriorityQueue queue = new PriorityQueue(comparator);
diff --git a/java/fury-core/src/main/java/org/apache/fury/serializer/collection/FuryArrayAsListSerializer.java b/java/fury-core/src/main/java/org/apache/fury/serializer/collection/FuryArrayAsListSerializer.java
index 09cb1297..dd11d0df 100644
--- a/java/fury-core/src/main/java/org/apache/fury/serializer/collection/FuryArrayAsListSerializer.java
+++ b/java/fury-core/src/main/java/org/apache/fury/serializer/collection/FuryArrayAsListSerializer.java
@@ -39,7 +39,7 @@ public final class FuryArrayAsListSerializer extends CollectionSerializer<ArrayA
   }
 
   public Collection newCollection(MemoryBuffer buffer) {
-    int numElements = buffer.readVarUint32();
+    int numElements = buffer.readVarUint32Small7();
     setNumElements(numElements);
     return new ArrayAsList(numElements);
   }
diff --git a/java/fury-core/src/main/java/org/apache/fury/serializer/collection/GuavaCollectionSerializers.java b/java/fury-core/src/main/java/org/apache/fury/serializer/collection/GuavaCollectionSerializers.java
index 2302de09..ddf49726 100644
--- a/java/fury-core/src/main/java/org/apache/fury/serializer/collection/GuavaCollectionSerializers.java
+++ b/java/fury-core/src/main/java/org/apache/fury/serializer/collection/GuavaCollectionSerializers.java
@@ -53,7 +53,7 @@ public class GuavaCollectionSerializers {
 
     @Override
     public T xread(MemoryBuffer buffer) {
-      int size = buffer.readVarUint32();
+      int size = buffer.readVarUint32Small7();
       List list = new ArrayList<>();
       xreadElements(fury, buffer, list, size);
       return xnewInstance(list);
@@ -71,7 +71,7 @@ public class GuavaCollectionSerializers {
 
     @Override
     public Collection newCollection(MemoryBuffer buffer) {
-      int numElements = buffer.readVarUint32();
+      int numElements = buffer.readVarUint32Small7();
       setNumElements(numElements);
       return new CollectionContainer<>(numElements);
     }
@@ -122,7 +122,7 @@ public class GuavaCollectionSerializers {
 
     @Override
     public Collection newCollection(MemoryBuffer buffer) {
-      int numElements = buffer.readVarUint32();
+      int numElements = buffer.readVarUint32Small7();
       setNumElements(numElements);
       return new CollectionContainer(numElements);
     }
@@ -153,7 +153,7 @@ public class GuavaCollectionSerializers {
 
     @Override
     public Collection newCollection(MemoryBuffer buffer) {
-      int numElements = buffer.readVarUint32();
+      int numElements = buffer.readVarUint32Small7();
       setNumElements(numElements);
       return new CollectionContainer<>(numElements);
     }
@@ -184,14 +184,14 @@ public class GuavaCollectionSerializers {
 
     @Override
     public Collection onCollectionWrite(MemoryBuffer buffer, T value) {
-      buffer.writeVarUint32(value.size());
+      buffer.writeVarUint32Small7(value.size());
       fury.writeRef(buffer, value.comparator());
       return value;
     }
 
     @Override
     public Collection newCollection(MemoryBuffer buffer) {
-      int numElements = buffer.readVarUint32();
+      int numElements = buffer.readVarUint32Small7();
       setNumElements(numElements);
       Comparator comparator = (Comparator) fury.readRef(buffer);
       return new SortedCollectionContainer(comparator, numElements);
@@ -216,7 +216,7 @@ public class GuavaCollectionSerializers {
 
     @Override
     public Map newMap(MemoryBuffer buffer) {
-      int numElements = buffer.readVarUint32();
+      int numElements = buffer.readVarUint32Small7();
       setNumElements(numElements);
       return new MapContainer(numElements);
     }
@@ -241,7 +241,7 @@ public class GuavaCollectionSerializers {
 
     @Override
     public T xread(MemoryBuffer buffer) {
-      int size = buffer.readVarUint32();
+      int size = buffer.readVarUint32Small7();
       Map map = new HashMap();
       xreadElements(fury, buffer, map, size);
       return xnewInstance(map);
@@ -319,14 +319,14 @@ public class GuavaCollectionSerializers {
 
     @Override
     public Map onMapWrite(MemoryBuffer buffer, T value) {
-      buffer.writeVarUint32(value.size());
+      buffer.writeVarUint32Small7(value.size());
       fury.writeRef(buffer, value.comparator());
       return value;
     }
 
     @Override
     public Map newMap(MemoryBuffer buffer) {
-      int numElements = buffer.readVarUint32();
+      int numElements = buffer.readVarUint32Small7();
       setNumElements(numElements);
       Comparator comparator = (Comparator) fury.readRef(buffer);
       return new SortedMapContainer<>(comparator, numElements);
diff --git a/java/fury-core/src/main/java/org/apache/fury/serializer/collection/ImmutableCollectionSerializers.java b/java/fury-core/src/main/java/org/apache/fury/serializer/collection/ImmutableCollectionSerializers.java
index 2cbe9aeb..9b637e65 100644
--- a/java/fury-core/src/main/java/org/apache/fury/serializer/collection/ImmutableCollectionSerializers.java
+++ b/java/fury-core/src/main/java/org/apache/fury/serializer/collection/ImmutableCollectionSerializers.java
@@ -109,7 +109,7 @@ public class ImmutableCollectionSerializers {
 
     @Override
     public Collection newCollection(MemoryBuffer buffer) {
-      int numElements = buffer.readVarUint32();
+      int numElements = buffer.readVarUint32Small7();
       setNumElements(numElements);
       if (Platform.JAVA_VERSION > 8) {
         return new CollectionContainer<>(numElements);
@@ -141,7 +141,7 @@ public class ImmutableCollectionSerializers {
 
     @Override
     public Collection newCollection(MemoryBuffer buffer) {
-      int numElements = buffer.readVarUint32();
+      int numElements = buffer.readVarUint32Small7();
       setNumElements(numElements);
       if (Platform.JAVA_VERSION > 8) {
         return new CollectionContainer<>(numElements);
@@ -173,7 +173,7 @@ public class ImmutableCollectionSerializers {
 
     @Override
     public Map newMap(MemoryBuffer buffer) {
-      int numElements = buffer.readVarUint32();
+      int numElements = buffer.readVarUint32Small7();
       setNumElements(numElements);
       if (Platform.JAVA_VERSION > 8) {
         return new JDKImmutableMapContainer(numElements);
diff --git a/java/fury-core/src/main/java/org/apache/fury/serializer/collection/MapSerializer.java b/java/fury-core/src/main/java/org/apache/fury/serializer/collection/MapSerializer.java
index 7c2832c8..0543d5f4 100644
--- a/java/fury-core/src/main/java/org/apache/fury/serializer/collection/MapSerializer.java
+++ b/java/fury-core/src/main/java/org/apache/fury/serializer/collection/MapSerializer.java
@@ -36,7 +36,7 @@ public class MapSerializer<T extends Map> extends AbstractMapSerializer<T> {
 
   @Override
   public Map onMapWrite(MemoryBuffer buffer, T value) {
-    buffer.writeVarUint32(value.size());
+    buffer.writeVarUint32Small7(value.size());
     return value;
   }
 
diff --git a/java/fury-core/src/main/java/org/apache/fury/serializer/collection/MapSerializers.java b/java/fury-core/src/main/java/org/apache/fury/serializer/collection/MapSerializers.java
index 98c34204..3733d264 100644
--- a/java/fury-core/src/main/java/org/apache/fury/serializer/collection/MapSerializers.java
+++ b/java/fury-core/src/main/java/org/apache/fury/serializer/collection/MapSerializers.java
@@ -63,7 +63,7 @@ public class MapSerializers {
 
     @Override
     public HashMap newMap(MemoryBuffer buffer) {
-      int numElements = buffer.readVarUint32();
+      int numElements = buffer.readVarUint32Small7();
       setNumElements(numElements);
       HashMap hashMap = new HashMap(numElements);
       fury.getRefResolver().reference(hashMap);
@@ -83,7 +83,7 @@ public class MapSerializers {
 
     @Override
     public LinkedHashMap newMap(MemoryBuffer buffer) {
-      int numElements = buffer.readVarUint32();
+      int numElements = buffer.readVarUint32Small7();
       setNumElements(numElements);
       LinkedHashMap hashMap = new LinkedHashMap(numElements);
       fury.getRefResolver().reference(hashMap);
@@ -103,7 +103,7 @@ public class MapSerializers {
 
     @Override
     public LazyMap newMap(MemoryBuffer buffer) {
-      int numElements = buffer.readVarUint32();
+      int numElements = buffer.readVarUint32Small7();
       setNumElements(numElements);
       LazyMap map = new LazyMap(numElements);
       fury.getRefResolver().reference(map);
@@ -122,7 +122,7 @@ public class MapSerializers {
 
     @Override
     public Map onMapWrite(MemoryBuffer buffer, T value) {
-      buffer.writeVarUint32(value.size());
+      buffer.writeVarUint32Small7(value.size());
       fury.writeRef(buffer, value.comparator());
       return value;
     }
@@ -130,7 +130,7 @@ public class MapSerializers {
     @SuppressWarnings("unchecked")
     @Override
     public Map newMap(MemoryBuffer buffer) {
-      setNumElements(buffer.readVarUint32());
+      setNumElements(buffer.readVarUint32Small7());
       T map;
       Comparator comparator = (Comparator) fury.readRef(buffer);
       if (type == TreeMap.class) {
@@ -164,7 +164,7 @@ public class MapSerializers {
     @Override
     public void xwrite(MemoryBuffer buffer, Map<?, ?> value) {
       // write length
-      buffer.writeVarUint32(0);
+      buffer.writeVarUint32Small7(0);
     }
 
     @Override
@@ -174,7 +174,7 @@ public class MapSerializers {
 
     @Override
     public Map<?, ?> xread(MemoryBuffer buffer) {
-      buffer.readVarUint32();
+      buffer.readVarUint32Small7();
       return Collections.EMPTY_MAP;
     }
   }
@@ -213,7 +213,7 @@ public class MapSerializers {
 
     @Override
     public void xwrite(MemoryBuffer buffer, Map<?, ?> value) {
-      buffer.writeVarUint32(1);
+      buffer.writeVarUint32Small7(1);
       Map.Entry entry = value.entrySet().iterator().next();
       fury.xwriteRef(buffer, entry.getKey());
       fury.xwriteRef(buffer, entry.getValue());
@@ -228,7 +228,7 @@ public class MapSerializers {
 
     @Override
     public Map<?, ?> xread(MemoryBuffer buffer) {
-      buffer.readVarUint32();
+      buffer.readVarUint32Small7();
       Object key = fury.xreadRef(buffer);
       Object value = fury.xreadRef(buffer);
       return Collections.singletonMap(key, value);
@@ -243,7 +243,7 @@ public class MapSerializers {
 
     @Override
     public ConcurrentHashMap newMap(MemoryBuffer buffer) {
-      int numElements = buffer.readVarUint32();
+      int numElements = buffer.readVarUint32Small7();
       setNumElements(numElements);
       ConcurrentHashMap map = new ConcurrentHashMap(numElements);
       fury.getRefResolver().reference(map);
@@ -265,7 +265,7 @@ public class MapSerializers {
 
     @Override
     public ConcurrentSkipListMap newMap(MemoryBuffer buffer) {
-      int numElements = buffer.readVarUint32();
+      int numElements = buffer.readVarUint32Small7();
       setNumElements(numElements);
       Comparator comparator = (Comparator) fury.readRef(buffer);
       ConcurrentSkipListMap map = new ConcurrentSkipListMap(comparator);
@@ -299,7 +299,7 @@ public class MapSerializers {
 
     @Override
     public Map onMapWrite(MemoryBuffer buffer, EnumMap value) {
-      buffer.writeVarUint32(value.size());
+      buffer.writeVarUint32Small7(value.size());
       Class keyType = (Class) Platform.getObject(value, keyTypeFieldOffset);
       fury.getClassResolver().writeClassAndUpdateCache(buffer, keyType);
       return value;
@@ -307,7 +307,7 @@ public class MapSerializers {
 
     @Override
     public EnumMap newMap(MemoryBuffer buffer) {
-      setNumElements(buffer.readVarUint32());
+      setNumElements(buffer.readVarUint32Small7());
       Class<?> keyType = fury.getClassResolver().readClassInfo(buffer).getCls();
       return new EnumMap(keyType);
     }
@@ -322,7 +322,7 @@ public class MapSerializers {
 
     @Override
     public void write(MemoryBuffer buffer, Map<String, T> value) {
-      buffer.writeVarUint32(value.size());
+      buffer.writeVarUint32Small7(value.size());
       for (Map.Entry<String, T> e : value.entrySet()) {
         fury.writeJavaStringRef(buffer, e.getKey());
         // If value is a collection, the `newCollection` method will record itself to
diff --git a/java/fury-core/src/main/java/org/apache/fury/type/ClassDef.java b/java/fury-core/src/main/java/org/apache/fury/type/ClassDef.java
index 38e354de..aee7ab1c 100644
--- a/java/fury-core/src/main/java/org/apache/fury/type/ClassDef.java
+++ b/java/fury-core/src/main/java/org/apache/fury/type/ClassDef.java
@@ -167,14 +167,14 @@ public class ClassDef implements Serializable {
       MemoryBuffer buf = MemoryUtils.buffer(32);
       IdentityObjectIntMap<String> map = new IdentityObjectIntMap<>(8, 0.5f);
       writeSharedString(buf, map, className);
-      buf.writeVarUint32(fieldsInfo.size());
+      buf.writeVarUint32Small7(fieldsInfo.size());
       for (FieldInfo fieldInfo : fieldsInfo) {
         writeSharedString(buf, map, fieldInfo.definedClass);
         byte[] bytes = fieldInfo.fieldName.getBytes(StandardCharsets.UTF_8);
         buf.writePrimitiveArrayWithSize(bytes, Platform.BYTE_ARRAY_OFFSET, bytes.length);
         fieldInfo.fieldType.write(buf);
       }
-      buf.writeVarUint32(extMeta.size());
+      buf.writeVarUint32Small7(extMeta.size());
       extMeta.forEach(
           (k, v) -> {
             byte[] keyBytes = k.getBytes(StandardCharsets.UTF_8);
@@ -199,7 +199,7 @@ public class ClassDef implements Serializable {
     if (id >= 0) {
       // TODO use flagged varint.
       buffer.writeBoolean(true);
-      buffer.writeVarUint32(id);
+      buffer.writeVarUint32Small7(id);
     } else {
       buffer.writeBoolean(false);
       byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
@@ -212,13 +212,13 @@ public class ClassDef implements Serializable {
     List<String> strings = new ArrayList<>();
     String className = readSharedString(buffer, strings);
     List<FieldInfo> fieldInfos = new ArrayList<>();
-    int numFields = buffer.readVarUint32();
+    int numFields = buffer.readVarUint32Small7();
     for (int i = 0; i < numFields; i++) {
       String definedClass = readSharedString(buffer, strings);
       String fieldName = new String(buffer.readBytesAndSize(), StandardCharsets.UTF_8);
       fieldInfos.add(new FieldInfo(definedClass, fieldName, FieldType.read(buffer)));
     }
-    int extMetaSize = buffer.readVarUint32();
+    int extMetaSize = buffer.readVarUint32Small7();
     Map<String, String> extMeta = new HashMap<>();
     for (int i = 0; i < extMetaSize; i++) {
       extMeta.put(
@@ -234,7 +234,7 @@ public class ClassDef implements Serializable {
   private static String readSharedString(MemoryBuffer buffer, List<String> strings) {
     String str;
     if (buffer.readBoolean()) {
-      return strings.get(buffer.readVarUintSmall());
+      return strings.get(buffer.readVarUint32Small7());
     } else {
       str = new String(buffer.readBytesAndSize(), StandardCharsets.UTF_8);
       strings.add(str);
diff --git a/java/fury-core/src/test/java/org/apache/fury/memory/MemoryBufferTest.java b/java/fury-core/src/test/java/org/apache/fury/memory/MemoryBufferTest.java
index 58f12aa9..acd7a683 100644
--- a/java/fury-core/src/test/java/org/apache/fury/memory/MemoryBufferTest.java
+++ b/java/fury-core/src/test/java/org/apache/fury/memory/MemoryBufferTest.java
@@ -582,6 +582,23 @@ public class MemoryBufferTest {
     assertEquals(buf.slice(readerIndex, buf.readerIndex() - readerIndex).readSliInt64(), value);
   }
 
+  @Test
+  public void testVarUint32Small7() {
+    MemoryBuffer buf = MemoryUtils.buffer(1);
+    buf.writeVarUint32Small7(1);
+    assertEquals(buf.readVarUint32Small7(), 1);
+    assertEquals(buf.writeVarUint32Small7(127), 1);
+    assertEquals(buf.readVarUint32Small7(), 127);
+    assertEquals(buf.writeVarUint32Small7(Short.MAX_VALUE), 3);
+    assertEquals(buf.readVarUint32Small7(), Short.MAX_VALUE);
+    assertEquals(buf.writeVarUint32Small7(Integer.MAX_VALUE), 5);
+    assertEquals(buf.readVarUint32Small7(), Integer.MAX_VALUE);
+    assertEquals(buf.writeVarUint32Small7(-1), 5);
+    assertEquals(buf.readVarUint32Small7(), -1);
+    assertEquals(buf.writeVarUint32Small7(0), 1);
+    assertEquals(buf.readVarUint32Small7(), 0);
+  }
+
   @Test
   public void testVarUint36Small() {
     MemoryBuffer buf = MemoryUtils.buffer(80);
diff --git a/scala/src/main/scala/org/apache/fury/serializer/scala/CollectionSerializer.scala b/scala/src/main/scala/org/apache/fury/serializer/scala/CollectionSerializer.scala
index 069d489c..0c116e86 100644
--- a/scala/src/main/scala/org/apache/fury/serializer/scala/CollectionSerializer.scala
+++ b/scala/src/main/scala/org/apache/fury/serializer/scala/CollectionSerializer.scala
@@ -149,7 +149,7 @@ class ScalaCollectionSerializer[A, T <: Iterable[A]] (fury: Fury, cls: Class[T])
   override def onCollectionWrite(buffer: MemoryBuffer, value: T): util.Collection[_] = {
     val factory: Factory[A, Any] = value.iterableFactory.iterableFactory
     val adapter = new CollectionAdapter[A, T](value)
-    buffer.writeVarUint32(adapter.size)
+    buffer.writeVarUint32Small7(adapter.size)
     fury.writeRef(buffer, factory)
     adapter
   }
@@ -163,7 +163,7 @@ class ScalaCollectionSerializer[A, T <: Iterable[A]] (fury: Fury, cls: Class[T])
 class ScalaSortedSetSerializer[A, T <: scala.collection.SortedSet[A]](fury: Fury, cls: Class[T])
   extends AbstractScalaCollectionSerializer[A, T](fury, cls) {
   override def onCollectionWrite(buffer: MemoryBuffer, value: T): util.Collection[_] = {
-    buffer.writeVarUint32(value.size)
+    buffer.writeVarUint32Small7(value.size)
     val factory = value.sortedIterableFactory.evidenceIterableFactory[Any](
       value.ordering.asInstanceOf[Ordering[Any]])
     fury.writeRef(buffer, factory)
@@ -179,7 +179,7 @@ class ScalaSortedSetSerializer[A, T <: scala.collection.SortedSet[A]](fury: Fury
 class ScalaSeqSerializer[A, T <: scala.collection.Seq[A]](fury: Fury, cls: Class[T])
   extends AbstractScalaCollectionSerializer[A, T](fury, cls)  {
   override def onCollectionWrite(buffer: MemoryBuffer, value: T): util.Collection[_] = {
-    buffer.writeVarUint32(value.size)
+    buffer.writeVarUint32Small7(value.size)
     val factory: Factory[A, Any] = value.iterableFactory.iterableFactory
     fury.writeRef(buffer, factory)
     new ListAdapter[Any](value)
diff --git a/scala/src/main/scala/org/apache/fury/serializer/scala/MapSerializer.scala b/scala/src/main/scala/org/apache/fury/serializer/scala/MapSerializer.scala
index 9dc23d96..df37b90d 100644
--- a/scala/src/main/scala/org/apache/fury/serializer/scala/MapSerializer.scala
+++ b/scala/src/main/scala/org/apache/fury/serializer/scala/MapSerializer.scala
@@ -116,7 +116,7 @@ class ScalaMapSerializer[K, V, T <: scala.collection.Map[K, V]](fury: Fury, cls:
   extends AbstractScalaMapSerializer[K, V, T](fury, cls) {
 
   override def onMapWrite(buffer: MemoryBuffer, value: T): util.Map[_, _] = {
-    buffer.writeVarUint32(value.size)
+    buffer.writeVarUint32Small7(value.size)
     val factory = value.mapFactory.mapFactory[Any, Any].asInstanceOf[Factory[Any, Any]]
     fury.writeRef(buffer, factory)
     new MapAdapter[K, V](value)
@@ -131,7 +131,7 @@ class ScalaMapSerializer[K, V, T <: scala.collection.Map[K, V]](fury: Fury, cls:
 class ScalaSortedMapSerializer[K, V, T <: scala.collection.SortedMap[K, V]](fury: Fury, cls: Class[T])
   extends AbstractScalaMapSerializer[K, V, T](fury, cls) {
   override def onMapWrite(buffer: MemoryBuffer, value: T): util.Map[_, _] = {
-    buffer.writeVarUint32(value.size)
+    buffer.writeVarUint32Small7(value.size)
     val factory = value.sortedMapFactory.sortedMapFactory[Any, Any](
       value.ordering.asInstanceOf[Ordering[Any]]).asInstanceOf[Factory[Any, Any]]
     fury.writeRef(buffer, factory)


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@fury.apache.org
For additional commands, e-mail: commits-help@fury.apache.org