对于大消息,protobuf是否应该比json更快?

对于大消息,protobuf是否应该比json更快?,json,performance,websocket,format,protocol-buffers,Json,Performance,Websocket,Format,Protocol Buffers,我已经创建了实时工作的应用程序,为此我使用websocket和两种不同格式的内容数据。我每秒发送大约47条消息,json大小为64117字节,protobuf大小为28024字节。我原以为protobuf会有更好的表现,但我没有。在图表上我看到了很大的差别,差不多10毫秒 原型文件如下所示: syntax = "proto3"; message PlayerProto { string nickname = 1; int32 position_x = 2; int32 p

我已经创建了实时工作的应用程序,为此我使用websocket和两种不同格式的内容数据。我每秒发送大约47条消息,json大小为64117字节,protobuf大小为28024字节。我原以为protobuf会有更好的表现,但我没有。在图表上我看到了很大的差别,差不多10毫秒

原型文件如下所示:

syntax = "proto3";

message PlayerProto {
string nickname = 1;
int32 position_x = 2;
int32 position_y = 3;
int32 score = 4;
string step_direction = 5;
int32 version = 6;
message AdditionalData {
    string text = 1;
    int32 number1 = 2;
    int32 number2 = 3;
    int32 number3 = 4;
}
repeated AdditionalData additionalData = 7;
encode(data): PlayerProto {
    const playerProto = new PlayerProto();
    playerProto.setNickname(data.nickname);
    playerProto.setPositionX(data.positionX);
    playerProto.setPositionY(data.positionY);
    playerProto.setScore(data.score);
    playerProto.setStepDirection(data.stepDirection);
    playerProto.setVersion(data.version);

    const newData = new Array<AdditionalData>(data.additionalData.length);

        for (let i = 0; i<data.additionalData.length;i++) {
            newData[i] = new AdditionalData();
            newData[i].setText(data.additionalData[i].text);
            newData[i].setNumber1(data.additionalData[i].number1)
            newData[i].setNumber2(data.additionalData[i].number2)
            newData[i].setNumber3(data.additionalData[i].number3)
        }

    playerProto.setAdditionaldataList(newData);

    return playerProto;
}
}

我每封邮件发送800个附加数据对象。我这样做是因为性能测试问题

为什么看起来像这样?它是否与protobuf中缓慢的序列化和反序列化有关? 我在客户端(angular)使用lib“google protobuf”:“^3.13.0”,在服务器端(spring)使用maven依赖项,如下所示(我还使用spring实现来实现STOMP格式):

转换器:

public class AdditionalDataConverter implements TypeConverter<List<AdditionalData>, List<AdditionalData>> {
@Override
public List<AdditionalData> toDomainValue(Object instance) {
    return (List<AdditionalData>) instance;
}

@Override
public List<AdditionalData> toProtobufValue(Object instance) {
    return (List<AdditionalData>) instance;
}
公共类AdditionalDataConverter实现TypeConverter{
@凌驾
公共列表toDomainValue(对象实例){
返回(列表)实例;
}
@凌驾
公共列表toProtobufValue(对象实例){
返回(列表)实例;
}
}

型号:

@Data
@ProtoClass(PlayerGenerated.PlayerProto.class)
public class Player extends GameObject {
@JsonIgnore
private final StringBuilder stringBuilder = new StringBuilder(20);

@ProtoField
private String nickname;
@ProtoField
private int positionX;
@ProtoField
private int positionY;
@ProtoField
private int score;
@ProtoField(converter = StringDirectionConverter.class)
private Direction stepDirection;
@ProtoField
private int version;
@ProtoField(converter = AdditionalDataConverter.class)
private List<AdditionalData> additionalData;

@Override
public byte[] encodeDataByProtobuf() {
    return Converter.create().toProtobuf(PlayerGenerated.PlayerProto.class, this).toByteArray();
}
// other things .....
}
@数据
@原型类(PlayerGenerated.PlayerProto.class)
公共类玩家扩展游戏对象{
@杰索尼奥雷
私有最终StringBuilder StringBuilder=新StringBuilder(20);
@原野
私有字符串昵称;
@原野
私人int positionX;
@原野
私人内部职位;
@原野
个人智力得分;
@ProtoField(converter=StringDirectionConverter.class)
私人指导;
@原野
私有int版本;
@ProtoField(converter=AdditionalDataConverter.class)
私人列表附加数据;
@凌驾
公共字节[]encodeDataByProtobuf(){
返回Converter.create().toProtobuf(PlayerGenerated.PlayerProto.class,this.toByteArray();
}
//其他事情。。。。。
}

此测量值适用于带放气压缩的websocket通信。我也检查了它的非压缩情况,我得到了更好的时间protobuf。为什么看起来像这样?对于protobuf(对于这种格式),Deflate压缩效率较低
public class AdditionalDataConverter implements TypeConverter<List<AdditionalData>, List<AdditionalData>> {
@Override
public List<AdditionalData> toDomainValue(Object instance) {
    return (List<AdditionalData>) instance;
}

@Override
public List<AdditionalData> toProtobufValue(Object instance) {
    return (List<AdditionalData>) instance;
}
@Data
@ProtoClass(PlayerGenerated.PlayerProto.class)
public class Player extends GameObject {
@JsonIgnore
private final StringBuilder stringBuilder = new StringBuilder(20);

@ProtoField
private String nickname;
@ProtoField
private int positionX;
@ProtoField
private int positionY;
@ProtoField
private int score;
@ProtoField(converter = StringDirectionConverter.class)
private Direction stepDirection;
@ProtoField
private int version;
@ProtoField(converter = AdditionalDataConverter.class)
private List<AdditionalData> additionalData;

@Override
public byte[] encodeDataByProtobuf() {
    return Converter.create().toProtobuf(PlayerGenerated.PlayerProto.class, this).toByteArray();
}
// other things .....
}