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 ea622446 refactor(java): Optimize Class ID allocation. (#1406)
ea622446 is described below
commit ea622446ed8f2653a65a0eebd9e35b234c8f1105
Author: LiangliangSui <[email protected]>
AuthorDate: Mon Mar 18 15:20:15 2024 +0800
refactor(java): Optimize Class ID allocation. (#1406)
1. `registeredClassIdCounter` is incremented every time
`register(Class<?> cls, int classId)` is successfully called, so it can
be used directly in `register(Class<?> cls)` without recalculation.
2. Delete `registeredId2Classes` and use `registeredId2ClassInfo` to
achieve the corresponding function.
---------
Signed-off-by: LiangliangSui <[email protected]>
---
.../org/apache/fury/resolver/ClassResolver.java | 25 +++++++++++-----------
1 file changed, 13 insertions(+), 12 deletions(-)
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 0e11568e..4f04f3bb 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
@@ -89,7 +89,6 @@ import org.apache.fury.codegen.Expression.Invoke;
import org.apache.fury.codegen.Expression.Literal;
import org.apache.fury.collection.IdentityMap;
import org.apache.fury.collection.IdentityObjectIntMap;
-import org.apache.fury.collection.LongMap;
import org.apache.fury.collection.ObjectMap;
import org.apache.fury.collection.Tuple2;
import org.apache.fury.config.CompatibleMode;
@@ -230,8 +229,9 @@ public class ClassResolver {
private final ShimDispatcher shimDispatcher;
private static class ExtRegistry {
- private short registeredClassIdCounter = 0;
- private final LongMap<Class<?>> registeredId2Classes = new
LongMap<>(initialCapacity);
+ // Here we set it to 1 because `NO_CLASS_ID` is 0 to avoid calculating it
again in
+ // `register(Class<?> cls)`.
+ private short classIdGenerator = 1;
private SerializerFactory serializerFactory;
private final IdentityMap<Class<?>, Short> registeredClassIdMap =
new IdentityMap<>(initialCapacity);
@@ -298,11 +298,13 @@ public class ClassResolver {
registerWithCheck(Class.class, CLASS_CLASS_ID);
registerWithCheck(Object.class, EMPTY_OBJECT_ID);
// Register common class ahead to get smaller class id for serialization.
+ // TODO(Liangliang Sui): Clean up duplicately registered Classes and throw
exceptions when
+ // Classes are duplicately registered.
registerCommonUsedClasses();
addDefaultSerializers();
registerDefaultClasses();
shimDispatcher.initialize();
- innerEndClassId = extRegistry.registeredClassIdCounter;
+ innerEndClassId = extRegistry.classIdGenerator;
}
private void addDefaultSerializers() {
@@ -394,10 +396,11 @@ public class ClassResolver {
/** register class. */
public void register(Class<?> cls) {
if (!extRegistry.registeredClassIdMap.containsKey(cls)) {
- while
(extRegistry.registeredId2Classes.containsKey(extRegistry.registeredClassIdCounter))
{
- extRegistry.registeredClassIdCounter++;
+ while (extRegistry.classIdGenerator < registeredId2ClassInfo.length
+ && registeredId2ClassInfo[extRegistry.classIdGenerator] != null) {
+ extRegistry.classIdGenerator++;
}
- register(cls, extRegistry.registeredClassIdCounter);
+ register(cls, extRegistry.classIdGenerator);
}
}
@@ -441,12 +444,11 @@ public class ClassResolver {
"Class %s with name %s has been registered, registering class
with same name are not allowed.",
extRegistry.registeredClasses.get(cls.getName()),
cls.getName()));
}
- Class<?> idToClass = extRegistry.registeredId2Classes.get(id);
- if (idToClass != null) {
+ if (id < registeredId2ClassInfo.length && registeredId2ClassInfo[id] !=
null) {
throw new IllegalArgumentException(
String.format(
"Class %s with id %s has been registered, registering class %s
with same id are not allowed.",
- idToClass, id, cls.getName()));
+ registeredId2ClassInfo[id].getCls(), id, cls.getName()));
}
extRegistry.registeredClassIdMap.put(cls, id);
if (registeredId2ClassInfo.length <= id) {
@@ -466,8 +468,7 @@ public class ClassResolver {
// serializer will be set lazily in `addSerializer` method if it's null.
registeredId2ClassInfo[id] = classInfo;
extRegistry.registeredClasses.put(cls.getName(), cls);
- extRegistry.registeredClassIdCounter++;
- extRegistry.registeredId2Classes.put(id, cls);
+ extRegistry.classIdGenerator++;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]