perf[protocol]: cut down javaasist code

This commit is contained in:
sun committed 2023-09-27 15:14:48 +08:00
1 parent 4878d20ed3
commit 72bb9c7813
4 files changed
+17 -9

No files matched your search

@@ -35,10 +35,10 @@ import java.util.Set;
*/
public abstract class ByteBufUtils {
//---------------------------------compatible--------------------------------------
public static final Double ZERO_DOUBLE = Double.valueOf(0D);
public static final Float ZERO_FLOAT = Float.valueOf(0F);
public static void adjustPadding(ByteBuf byteBuf, int predictionLength, int beforeWriteIndex) {
// 因为写入的是可变长的int,如果预留的位置过多,则清除多余的位置
var currentWriteIndex = byteBuf.writerIndex();
@@ -66,6 +66,10 @@ public abstract class ByteBufUtils {
}
}
public static boolean compatibleRead(ByteBuf byteBuf, int beforeReadIndex, int length) {
return length == -1 || byteBuf.readerIndex() >= length + beforeReadIndex;
}
//---------------------------------boolean--------------------------------------
public static void writeBoolean(ByteBuf byteBuf, boolean value) {
byteBuf.writeBoolean(value);
@@ -218,7 +218,7 @@ public abstract class EnhanceUtils {
builder.append("{");
builder.append(StringUtils.format("int length = {}.readInt($1);", byteBufUtils));
builder.append("if(length==0){return null;}");
builder.append("int readIndex = $1.readerIndex();");
builder.append("int beforeReadIndex = $1.readerIndex();");
var packetClazz = constructor.getDeclaringClass();
if (packetClazz.isRecord()) {
var fields = registration.getFields();
@@ -232,7 +232,7 @@ public abstract class EnhanceUtils {
// protocol backwards compatibility,协议向后兼容
if (field.isAnnotationPresent(Compatible.class)) {
var defaultReadObject = enhanceSerializer(fieldRegistration.serializer()).defaultValue(builder, field, fieldRegistration);
builder.append("if (length != -1 && $1.readerIndex() < length + readIndex) {");
builder.append(StringUtils.format("if (!{}.compatibleRead($1, beforeReadIndex, length)) {", byteBufUtils));
var compatibleReadObject = enhanceSerializer(fieldRegistration.serializer()).readObject(builder, field, fieldRegistration);
builder.append(StringUtils.format("{} = {};", defaultReadObject, compatibleReadObject));
builder.append("}");
@@ -253,7 +253,7 @@ public abstract class EnhanceUtils {
var fieldRegistration = fieldRegistrations[i];
// protocol backwards compatibility,协议向后兼容
if (field.isAnnotationPresent(Compatible.class)) {
builder.append("if (length == -1 || $1.readerIndex() >= length + readIndex) {");
builder.append(StringUtils.format("if ({}.compatibleRead($1, beforeReadIndex, length)) {", byteBufUtils));
var defaultReadObject = enhanceSerializer(fieldRegistration.serializer()).defaultValue(builder, field, fieldRegistration);
if (Modifier.isPublic(field.getModifiers())) {
builder.append(StringUtils.format("packet.{}={};", field.getName(), defaultReadObject));
@@ -279,7 +279,7 @@ public abstract class EnhanceUtils {
}
}
builder.append("if (length > 0) { $1.readerIndex(readIndex + length); }");
builder.append("if (length > 0) { $1.readerIndex(beforeReadIndex + length); }");
builder.append("return packet;}");
return builder.toString();
@@ -103,13 +103,14 @@ public class ProtocolRegistration implements IProtocolRegistration {
@Override
public Object read(ByteBuf byteBuf) {
// length为-1代表协议没有可兼容的部分,0代表为空对象,正数代表需要兼容的协议长度
var length = ByteBufUtils.readInt(byteBuf);
if (length == 0) {
return null;
}
Object object = null;
var readIndex = byteBuf.readerIndex();
var beforeReadIndex = byteBuf.readerIndex();
var packetClazz = constructor.getDeclaringClass();
if (packetClazz.isRecord()) {
var originFields = ProtocolAnalysis.getFields(packetClazz);
@@ -121,7 +122,7 @@ public class ProtocolRegistration implements IProtocolRegistration {
// 协议向后兼容
if (field.isAnnotationPresent(Compatible.class)) {
if (length == -1 || byteBuf.readerIndex() >= length + readIndex) {
if (ByteBufUtils.compatibleRead(byteBuf, beforeReadIndex, length)) {
constructorParams[index] = packetFieldRegistration.defaultValue();
continue;
}
@@ -139,7 +140,7 @@ public class ProtocolRegistration implements IProtocolRegistration {
ISerializer serializer = packetFieldRegistration.serializer();
// 协议向后兼容
if (field.isAnnotationPresent(Compatible.class)) {
if (length == -1 || byteBuf.readerIndex() - readIndex >= length) {
if (ByteBufUtils.compatibleRead(byteBuf, beforeReadIndex, length)) {
ReflectionUtils.setField(field, object, packetFieldRegistration.defaultValue());
continue;
}
@@ -150,7 +151,7 @@ public class ProtocolRegistration implements IProtocolRegistration {
}
if (length > 0) {
byteBuf.readerIndex(readIndex + length);
byteBuf.readerIndex(beforeReadIndex + length);
}
return object;
+3
View File
@@ -4,6 +4,9 @@ option java_package = "com.zfoo.protocol.packet";
option java_outer_classname = "ProtobufObject";
// protoc -I=D:\zfoo\protocol\src\test\resources --java_out=D:\zfoo\protocol\src\test\java D:\zfoo\protocol\src\test\resources\speed.proto
// protoc -I=D:\Project\zfoo\protocol\src\test\resources --js_out=D:\Project\zfoo\protocol\src\test D:\Project\zfoo\protocol\src\test\resources\speed.proto
// npm install -g ts-protoc-gen
// protoc -I=D:\Project\zfoo\protocol\src\test\resources --ts_out=D:\Project\zfoo\protocol\src\test D:\Project\zfoo\protocol\src\test\resources\speed.proto
message ObjectB {
bool flag = 1;