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

jermy pushed a commit to branch StringId-hold-bytes
in repository https://gitbox.apache.org/repos/asf/incubator-hugegraph.git

commit 7202d54c34d906fd62a8e79b3ad68ae6856ebe4b
Author: Jermy Li <je...@apache.org>
AuthorDate: Sun Aug 31 01:19:20 2025 +0800

    perf(core): StringId hold bytes to avoid decode/encode
    
    Change-Id: I1ff93a2ee31f142fb7ab5cfe0e038ef2da2f982d
---
 .../apache/hugegraph/backend/id/IdGenerator.java   | 43 ++++++++++++++++------
 .../memory/consumer/impl/id/StringIdOffHeap.java   |  1 +
 2 files changed, 33 insertions(+), 11 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..385555bdf 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,19 @@ 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");
             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 +151,33 @@ public abstract class IdGenerator {
 
         @Override
         public Object asObject() {
-            return this.id;
+            return this.asString();
         }
 
         @Override
         public String asString() {
+            if (this.id == 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) {
+                this.bytes = StringEncoding.encode(this.id);
+            }
+            return this.bytes;
         }
 
         @Override
         public int length() {
-            return this.id.length();
+            return this.asString().length();
         }
 
         @Override
@@ -174,25 +186,34 @@ 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 {
+                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..98bdc25ab 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
@@ -70,6 +70,7 @@ public class StringIdOffHeap extends IdGenerator.StringId 
implements OffHeapObje
     @Override
     public void releaseOriginalVarsOnHeap() {
         this.id = null;
+        this.bytes = null;
     }
 
     @Override

Reply via email to