Merge pull request #80 from a610569731/main

perf[protocol ]:Protocol auto List by order
This commit is contained in:
godotg
2023-11-17 17:14:39 +08:00
committed by GitHub
7 changed files with 36 additions and 16 deletions
@@ -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
* CN:子协议会自动注册协议号protocolId,如果子协议没有指定protocolId则自动生成protocolId
*/
public static void initProtocolAuto(Set<Class<?>> protocolClassSet, GenerateOperation generateOperation) {
ProtocolAnalysis.analyzeAuto(protocolClassSet, generateOperation);
public static void initProtocolAuto(List<Class<?>> protocolClassList, GenerateOperation 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.collection.ArrayUtils;
import com.zfoo.protocol.collection.CollectionUtils;
import com.zfoo.protocol.exception.AssertException;
import com.zfoo.protocol.exception.RunException;
import com.zfoo.protocol.exception.UnknownException;
import com.zfoo.protocol.generate.GenerateOperation;
@@ -126,17 +127,33 @@ public class ProtocolAnalysis {
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());
// 获取所有协议类
var relevantClassSet = new HashSet<>(protocolClassSet);
for (var clazz : protocolClassSet) {
relevantClassSet.addAll(ClassUtils.relevantClass(clazz));
LinkedHashSet<Class> tempProtocolClassSet = new LinkedHashSet<>(protocolClassList);
//去重
protocolClassList = new ArrayList<>();
for(Class clazz : tempProtocolClassSet){
protocolClassList.add(clazz);
}
var relevantClassList = relevantClassSet.stream()
Set<Class> relevantClassList = new LinkedHashSet<>(protocolClassList);
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()))
.toList();
.toList();*/
// 检查协议类是否合法
var noProtocolIds = new ArrayList<Class<?>>();
@@ -157,7 +174,7 @@ public class ProtocolAnalysis {
}
// 协议id和协议信息对应起来
for (var protocolClass : relevantClassSet) {
for (Class protocolClass : relevantClassList) {
var registration = parseProtocolRegistration(protocolClass, ProtocolModule.DEFAULT_PROTOCOL_MODULE);
protocols[registration.protocolId()] = registration;
}
@@ -357,7 +357,7 @@ public class BenchmarkTesting {
static {
// 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++) {
executors[i] = Executors.newSingleThreadExecutor();
@@ -25,6 +25,7 @@ import org.junit.Test;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Set;
import static com.zfoo.protocol.BenchmarkTesting.complexObject;
@@ -44,7 +45,7 @@ public class CompatibleTesting {
*/
@Test
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 buffer = new UnpooledHeapByteBuf(ByteBufAllocator.DEFAULT, 100, 1_0000);
@@ -128,7 +129,7 @@ public class CompatibleTesting {
@Test
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-out-compatible.bytes"));
@@ -728,7 +728,7 @@ public class FieldSpeedTesting {
System.setProperty("io.netty.buffer.checkAccessible", "false");
System.setProperty("io.netty.buffer.checkBounds", "false");
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<>() {
@@ -18,6 +18,7 @@ import com.zfoo.protocol.serializer.CodeLanguage;
import org.junit.Ignore;
import org.junit.Test;
import java.util.List;
import java.util.Set;
/**
@@ -44,7 +45,7 @@ public class GenerateTesting {
generateLanguages.add(CodeLanguage.Python);
// 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.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -94,7 +95,7 @@ public class ExportBinaryTesting {
storageManager.initAfter();
// 生成协议
var protocols = new HashSet<Class<?>>();
List protocols = new ArrayList<>();
protocols.add(ResourceData.class);
protocols.addAll(storageManager.storageMap().keySet());
var operation = new GenerateOperation();