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]