Merge pull request #80 from a610569731/main

perf[protocol ]:Protocol auto List by order
This commit is contained in:
godotg authored and GitHub committed 2023-11-17 17:14:39 +08:00
commit ffeeb63029
7 files changed
+36 -16

No files matched your search

@@ -139,8 +139,8 @@ public class ProtocolManager {
* EN:Register protocol and automatically generates a protocol ID if the subprotocol does not specify a protocol ID * EN:Register protocol and automatically generates a protocol ID if the subprotocol does not specify a protocol ID
* CN:子协议会自动注册协议号protocolId,如果子协议没有指定protocolId则自动生成protocolId * CN:子协议会自动注册协议号protocolId,如果子协议没有指定protocolId则自动生成protocolId
*/ */
public static void initProtocolAuto(Set<Class<?>> protocolClassSet, GenerateOperation generateOperation) { public static void initProtocolAuto(List<Class<?>> protocolClassList, GenerateOperation generateOperation) {
ProtocolAnalysis.analyzeAuto(protocolClassSet, generateOperation); ProtocolAnalysis.analyzeAuto(protocolClassList, generateOperation);
} }
} }
@@ -17,6 +17,7 @@ import com.zfoo.protocol.anno.Compatible;
import com.zfoo.protocol.anno.Protocol; import com.zfoo.protocol.anno.Protocol;
import com.zfoo.protocol.collection.ArrayUtils; import com.zfoo.protocol.collection.ArrayUtils;
import com.zfoo.protocol.collection.CollectionUtils; import com.zfoo.protocol.collection.CollectionUtils;
import com.zfoo.protocol.exception.AssertException;
import com.zfoo.protocol.exception.RunException; import com.zfoo.protocol.exception.RunException;
import com.zfoo.protocol.exception.UnknownException; import com.zfoo.protocol.exception.UnknownException;
import com.zfoo.protocol.generate.GenerateOperation; import com.zfoo.protocol.generate.GenerateOperation;
@@ -126,17 +127,33 @@ public class ProtocolAnalysis {
enhance(generateOperation, enhanceList); enhance(generateOperation, enhanceList);
} }
public static synchronized void analyzeAuto(Set<Class<?>> protocolClassSet, GenerateOperation generateOperation) { public static synchronized void analyzeAuto(List<Class<?>> protocolClassList, GenerateOperation generateOperation) {
AssertionUtils.notNull(subProtocolIdMap, "[{}] initialization has already been completed, please do not repeat the initialization", ProtocolManager.class.getSimpleName()); AssertionUtils.notNull(subProtocolIdMap, "[{}] initialization has already been completed, please do not repeat the initialization", ProtocolManager.class.getSimpleName());
// 获取所有协议类 // 获取所有协议类
var relevantClassSet = new HashSet<>(protocolClassSet); LinkedHashSet<Class> tempProtocolClassSet = new LinkedHashSet<>(protocolClassList);
for (var clazz : protocolClassSet) { //去重
relevantClassSet.addAll(ClassUtils.relevantClass(clazz)); protocolClassList = new ArrayList<>();
for(Class clazz : tempProtocolClassSet){
protocolClassList.add(clazz);
} }
Set<Class> relevantClassList = new LinkedHashSet<>(protocolClassList);
var relevantClassList = relevantClassSet.stream() for (var clazz : protocolClassList) {
Set<Class<?>> classSet = ClassUtils.relevantClass(clazz);
for(Class cls :classSet){
if( !relevantClassList.contains(cls)){
int protocolId = getProtocolIdAndCheckClass(cls);
if(protocolId >= 0){
relevantClassList.add(cls);
}else{
throw new AssertException("[class:{}]类型必须声明", cls.getCanonicalName());
}
}
}
}
//var relevantClassList = relevantClassSet;
/* var relevantClassList = relevantClassSet.stream()
.sorted((a, b) -> a.getCanonicalName().compareTo(b.getCanonicalName())) .sorted((a, b) -> a.getCanonicalName().compareTo(b.getCanonicalName()))
.toList(); .toList();*/
// 检查协议类是否合法 // 检查协议类是否合法
var noProtocolIds = new ArrayList<Class<?>>(); var noProtocolIds = new ArrayList<Class<?>>();
@@ -157,7 +174,7 @@ public class ProtocolAnalysis {
} }
// 协议id和协议信息对应起来 // 协议id和协议信息对应起来
for (var protocolClass : relevantClassSet) { for (Class protocolClass : relevantClassList) {
var registration = parseProtocolRegistration(protocolClass, ProtocolModule.DEFAULT_PROTOCOL_MODULE); var registration = parseProtocolRegistration(protocolClass, ProtocolModule.DEFAULT_PROTOCOL_MODULE);
protocols[registration.protocolId()] = registration; protocols[registration.protocolId()] = registration;
} }
@@ -357,7 +357,7 @@ public class BenchmarkTesting {
static { static {
// zfoo协议注册(其实就是:将Set里面的协议号和对应的类注册好,这样子就可以根据协议号知道是反序列化为哪个类) // zfoo协议注册(其实就是:将Set里面的协议号和对应的类注册好,这样子就可以根据协议号知道是反序列化为哪个类)
ProtocolManager.initProtocolAuto(Set.of(ComplexObject.class, NormalObject.class, SimpleObject.class, EmptyObject.class, VeryBigObject.class), GenerateOperation.NO_OPERATION); ProtocolManager.initProtocolAuto(List.of(ComplexObject.class, NormalObject.class, SimpleObject.class, EmptyObject.class, VeryBigObject.class), GenerateOperation.NO_OPERATION);
for (int i = 0; i < executors.length; i++) { for (int i = 0; i < executors.length; i++) {
executors[i] = Executors.newSingleThreadExecutor(); executors[i] = Executors.newSingleThreadExecutor();
@@ -25,6 +25,7 @@ import org.junit.Test;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.List;
import java.util.Set; import java.util.Set;
import static com.zfoo.protocol.BenchmarkTesting.complexObject; import static com.zfoo.protocol.BenchmarkTesting.complexObject;
@@ -44,7 +45,7 @@ public class CompatibleTesting {
*/ */
@Test @Test
public void compatibleTest() throws IOException { public void compatibleTest() throws IOException {
ProtocolManager.initProtocolAuto(Set.of(ComplexObject.class, NormalObject.class, SimpleObject.class, EmptyObject.class, VeryBigObject.class), GenerateOperation.NO_OPERATION); ProtocolManager.initProtocolAuto(List.of(ComplexObject.class, NormalObject.class, SimpleObject.class, EmptyObject.class, VeryBigObject.class), GenerateOperation.NO_OPERATION);
var bytes = IOUtils.toByteArray(ClassUtils.getFileFromClassPath("ComplexObject.bytes")); var bytes = IOUtils.toByteArray(ClassUtils.getFileFromClassPath("ComplexObject.bytes"));
var buffer = new UnpooledHeapByteBuf(ByteBufAllocator.DEFAULT, 100, 1_0000); var buffer = new UnpooledHeapByteBuf(ByteBufAllocator.DEFAULT, 100, 1_0000);
@@ -128,7 +129,7 @@ public class CompatibleTesting {
@Test @Test
public void normalReadTest() throws IOException { public void normalReadTest() throws IOException {
ProtocolManager.initProtocolAuto(Set.of(ComplexObject.class, NormalObject.class, SimpleObject.class, EmptyObject.class, VeryBigObject.class), GenerateOperation.NO_OPERATION); ProtocolManager.initProtocolAuto(List.of(ComplexObject.class, NormalObject.class, SimpleObject.class, EmptyObject.class, VeryBigObject.class), GenerateOperation.NO_OPERATION);
// var bytes = IOUtils.toByteArray(ClassUtils.getFileFromClassPath("compatible/normal-no-compatible.bytes")); // var bytes = IOUtils.toByteArray(ClassUtils.getFileFromClassPath("compatible/normal-no-compatible.bytes"));
// var bytes = IOUtils.toByteArray(ClassUtils.getFileFromClassPath("compatible/normal-out-compatible.bytes")); // var bytes = IOUtils.toByteArray(ClassUtils.getFileFromClassPath("compatible/normal-out-compatible.bytes"));
@@ -728,7 +728,7 @@ public class FieldSpeedTesting {
System.setProperty("io.netty.buffer.checkAccessible", "false"); System.setProperty("io.netty.buffer.checkAccessible", "false");
System.setProperty("io.netty.buffer.checkBounds", "false"); System.setProperty("io.netty.buffer.checkBounds", "false");
var op = GenerateOperation.NO_OPERATION; var op = GenerateOperation.NO_OPERATION;
ProtocolManager.initProtocolAuto(Set.of(IntObject.class, IntegerObject.class, FloatObject.class, BytesObject.class, StringObject.class, ListIntegerObject.class, SetObject.class, MapObject.class, InnerObjectObject.class), op); ProtocolManager.initProtocolAuto(List.of(IntObject.class, IntegerObject.class, FloatObject.class, BytesObject.class, StringObject.class, ListIntegerObject.class, SetObject.class, MapObject.class, InnerObjectObject.class), op);
} }
public static final ThreadLocal<Kryo> kryos = new ThreadLocal<>() { public static final ThreadLocal<Kryo> kryos = new ThreadLocal<>() {
@@ -18,6 +18,7 @@ import com.zfoo.protocol.serializer.CodeLanguage;
import org.junit.Ignore; import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import java.util.List;
import java.util.Set; import java.util.Set;
/** /**
@@ -44,7 +45,7 @@ public class GenerateTesting {
generateLanguages.add(CodeLanguage.Python); generateLanguages.add(CodeLanguage.Python);
// Initialize and then generate the protocol // Initialize and then generate the protocol
ProtocolManager.initProtocolAuto(Set.of(ComplexObject.class, NormalObject.class, SimpleObject.class, EmptyObject.class, VeryBigObject.class), op); ProtocolManager.initProtocolAuto(List.of(ComplexObject.class, NormalObject.class, SimpleObject.class, EmptyObject.class, VeryBigObject.class), op);
} }
} }
@@ -33,6 +33,7 @@ import org.junit.Test;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -94,7 +95,7 @@ public class ExportBinaryTesting {
storageManager.initAfter(); storageManager.initAfter();
// 生成协议 // 生成协议
var protocols = new HashSet<Class<?>>(); List protocols = new ArrayList<>();
protocols.add(ResourceData.class); protocols.add(ResourceData.class);
protocols.addAll(storageManager.storageMap().keySet()); protocols.addAll(storageManager.storageMap().keySet());
var operation = new GenerateOperation(); var operation = new GenerateOperation();