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

vgalaxies pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-hugegraph.git


The following commit(s) were added to refs/heads/master by this push:
     new 3d8be7fe7 perf(core): StringId hold bytes to avoid decode/encode 
(#2862)
3d8be7fe7 is described below

commit 3d8be7fe763cbcc5d320e9a1ffa7236fe45b2b76
Author: Jermy Li <[email protected]>
AuthorDate: Tue Sep 16 10:24:22 2025 +0800

    perf(core): StringId hold bytes to avoid decode/encode (#2862)
---
 .../apache/hugegraph/backend/id/IdGenerator.java   | 51 +++++++++++++++++-----
 .../memory/consumer/impl/id/StringIdOffHeap.java   |  8 +++-
 2 files changed, 46 insertions(+), 13 deletions(-)

diff --git 
a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/id/IdGenerator.java
 
b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/id/IdGenerator.java
index 17cc11684..9f1bcc56f 100644
--- 
a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/id/IdGenerator.java
+++ 
b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/id/IdGenerator.java
@@ -23,6 +23,7 @@ import java.util.UUID;
 import org.apache.hugegraph.backend.id.Id.IdType;
 import org.apache.hugegraph.backend.serializer.BytesBuffer;
 import org.apache.hugegraph.structure.HugeVertex;
+import org.apache.hugegraph.util.Bytes;
 import org.apache.hugegraph.util.E;
 import org.apache.hugegraph.util.LongEncoding;
 import org.apache.hugegraph.util.NumericUtil;
@@ -128,14 +129,20 @@ public abstract class IdGenerator {
     public static class StringId implements Id {
 
         protected String id;
+        protected byte[] bytes;
 
         public StringId(String id) {
-            E.checkArgument(!id.isEmpty(), "The id can't be empty");
+            E.checkArgument(id != null && !id.isEmpty(),
+                            "The id can't be null or empty");
             this.id = id;
+            this.bytes = null;
         }
 
         public StringId(byte[] bytes) {
-            this.id = StringEncoding.decode(bytes);
+            E.checkArgument(bytes != null && bytes.length > 0,
+                            "The id bytes can't be null or empty");
+            this.bytes = bytes;
+            this.id = null;
         }
 
         @Override
@@ -145,27 +152,35 @@ public abstract class IdGenerator {
 
         @Override
         public Object asObject() {
-            return this.id;
+            return this.asString();
         }
 
         @Override
         public String asString() {
+            if (this.id == null) {
+                assert this.bytes != null;
+                this.id = StringEncoding.decode(this.bytes);
+            }
             return this.id;
         }
 
         @Override
         public long asLong() {
-            return Long.parseLong(this.id);
+            return Long.parseLong(this.asString());
         }
 
         @Override
         public byte[] asBytes() {
-            return StringEncoding.encode(this.id);
+            if (this.bytes == null) {
+                assert this.id != null;
+                this.bytes = StringEncoding.encode(this.id);
+            }
+            return this.bytes;
         }
 
         @Override
         public int length() {
-            return this.id.length();
+            return this.asString().length();
         }
 
         @Override
@@ -174,25 +189,37 @@ public abstract class IdGenerator {
             if (cmp != 0) {
                 return cmp;
             }
-            return this.id.compareTo(other.asString());
+            if (this.id != null) {
+                return this.id.compareTo(other.asString());
+            } else {
+                return Bytes.compare(this.bytes, other.asBytes());
+            }
         }
 
         @Override
         public int hashCode() {
-            return this.id.hashCode();
+            return this.asString().hashCode();
         }
 
         @Override
-        public boolean equals(Object other) {
-            if (!(other instanceof StringId)) {
+        public boolean equals(Object obj) {
+            if (!(obj instanceof StringId)) {
                 return false;
             }
-            return this.id.equals(((StringId) other).id);
+            StringId other = (StringId) obj;
+            if (this.id != null) {
+                return this.id.equals(other.asString());
+            } else if (other.bytes == null) {
+                return this.asString().equals(other.asString());
+            } else {
+                assert this.bytes != null;
+                return Bytes.equals(this.bytes, other.asBytes());
+            }
         }
 
         @Override
         public String toString() {
-            return this.id;
+            return this.asString();
         }
     }
 
diff --git 
a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/memory/consumer/impl/id/StringIdOffHeap.java
 
b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/memory/consumer/impl/id/StringIdOffHeap.java
index be96c2c96..d02658382 100644
--- 
a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/memory/consumer/impl/id/StringIdOffHeap.java
+++ 
b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/memory/consumer/impl/id/StringIdOffHeap.java
@@ -61,7 +61,12 @@ public class StringIdOffHeap extends IdGenerator.StringId 
implements OffHeapObje
 
     @Override
     public void serializeSelfToByteBuf(MemoryPool memoryPool) {
-        byte[] stringBytes = id.getBytes((StandardCharsets.UTF_8));
+        byte[] stringBytes;
+        if (this.bytes != null) {
+            stringBytes = this.bytes;
+        } else {
+            stringBytes = this.id.getBytes((StandardCharsets.UTF_8));
+        }
         this.idOffHeap = (ByteBuf) 
memoryPool.requireMemory(stringBytes.length, memoryPool);
         this.idOffHeap.markReaderIndex();
         this.idOffHeap.writeBytes(stringBytes);
@@ -70,6 +75,7 @@ public class StringIdOffHeap extends IdGenerator.StringId 
implements OffHeapObje
     @Override
     public void releaseOriginalVarsOnHeap() {
         this.id = null;
+        this.bytes = null;
     }
 
     @Override

Reply via email to