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 beb508fd feat(java): rewrite readVarUint64 algorithm (#1463)
beb508fd is described below

commit beb508fd6da09ca4d52cf3dccd6675ae14d37490
Author: Shawn Yang <[email protected]>
AuthorDate: Fri Apr 5 08:40:17 2024 +0800

    feat(java): rewrite readVarUint64 algorithm (#1463)
---
 .../java/org/apache/fury/memory/MemoryBuffer.java  | 67 +++++++++++-----------
 1 file changed, 33 insertions(+), 34 deletions(-)

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 748aea14..45db5ddc 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
@@ -1695,40 +1695,39 @@ public final class MemoryBuffer {
       return readPositiveVarLongSlow();
     }
     // varint are written using little endian byte order, so read by little 
endian byte order.
-    long eightByteValue = unsafeGetLong(readIdx);
-    long b = eightByteValue & 0xFF;
-    readIdx++; // read one byte
-    long result = b & 0x7F;
-    if ((b & 0x80) != 0) {
-      readIdx++; // read one byte
-      b = (eightByteValue >>> 8) & 0xFF;
-      result |= (b & 0x7F) << 7;
-      if ((b & 0x80) != 0) {
-        readIdx++; // read one byte
-        b = (eightByteValue >>> 16) & 0xFF;
-        result |= (b & 0x7F) << 14;
-        if ((b & 0x80) != 0) {
-          readIdx++; // read one byte
-          b = (eightByteValue >>> 24) & 0xFF;
-          result |= (b & 0x7F) << 21;
-          if ((b & 0x80) != 0) {
-            readIdx++; // read one byte
-            b = (eightByteValue >>> 32) & 0xFF;
-            result |= (b & 0x7F) << 28;
-            if ((b & 0x80) != 0) {
-              readIdx++; // read one byte
-              b = (eightByteValue >>> 40) & 0xFF;
-              result |= (b & 0x7F) << 35;
-              if ((b & 0x80) != 0) {
-                readIdx++; // read one byte
-                b = (eightByteValue >>> 48) & 0xFF;
-                result |= (b & 0x7F) << 42;
-                if ((b & 0x80) != 0) {
-                  readIdx++; // read one byte
-                  b = (eightByteValue >>> 56) & 0xFF;
-                  result |= (b & 0x7F) << 49;
-                  if ((b & 0x80) != 0) {
-                    b = unsafeGet(readIdx++); // read one byte
+    long value = unsafeGetLong(readIdx);
+    // Duplicate and manual inline for performance.
+    // noinspection Duplicates
+    readIdx++;
+    long result = value & 0x7F;
+    if ((value & 0x80) != 0) {
+      readIdx++;
+      // 0x3f80: 0b1111111 << 7
+      result |= (value >>> 1) & 0x3f80;
+      // 0x8000: 0b1 << 15
+      if ((value & 0x8000) != 0) {
+        readIdx++;
+        // 0x1fc000: 0b1111111 << 14
+        result |= (value >>> 2) & 0x1fc000;
+        // 0x800000: 0b1 << 23
+        if ((value & 0x800000) != 0) {
+          readIdx++;
+          // 0xfe00000: 0b1111111 << 21
+          result |= (value >>> 3) & 0xfe00000;
+          if ((value & 0x80000000L) != 0) {
+            readIdx++;
+            result |= (value >>> 4) & 0x7f0000000L;
+            if ((value & 0x8000000000L) != 0) {
+              readIdx++;
+              result |= (value >>> 5) & 0x3f800000000L;
+              if ((value & 0x800000000000L) != 0) {
+                readIdx++;
+                result |= (value >>> 6) & 0x1fc0000000000L;
+                if ((value & 0x80000000000000L) != 0) {
+                  readIdx++;
+                  result |= (value >>> 7) & 0xfe000000000000L;
+                  if ((value & 0x8000000000000000L) != 0) {
+                    long b = UNSAFE.getByte(heapMemory, address + readIdx++);
                     result |= b << 56;
                   }
                 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to