找回密码
 立即注册
查看: 222|回复: 1

google的protobuf比这样java原生的方式更有效率吗?

[复制链接]
发表于 2023-6-16 16:26 | 显示全部楼层 |阅读模式
@Override
    public void write(java.io.DataOutput do) throws IOException {
       do.writeUTF(this.string1);
       do.writeUTF(this.string1);
       do.writeLong(this.long1);
    }

    @Override
    public void readFields(java.io.DataInput di) throws IOException {
        this.string1= di.readUTF();
        this.string2 = di.readUTF();
        this.long1 = di.readLong();
    }

如果更有效率,为什么?和java这样比有什么优错误谬误?

此外下面这个链接的成果是啥意思?
Home · eishay/jvm-serializers Wiki · GitHub
发表于 2023-6-16 16:27 | 显示全部楼层
在这种简单的情况下,肯定是你写的这种原生的更快,内存使用也更少
但是protobuf不止是简单的解决单一的、不变的序列化/反序列化,他关注的重点在:
1. 确保正确。原生的方式如果纯手写,那么必须保证每个字段读写的大小、顺序都一致,而如果类一多,对人脑是个很大的负担。所以用代码生成代码的方式,减轻人脑的负担就是更好的选择。
2. 高版本兼容低版本。如果你的数据类成员不是一成不变的,而是随着业务的扩大会不断的新增,而旧有的数据不能在升级的同时立即转换为新的格式,也就是说新增了数据类成员,改变了读取逻辑之后,你的程序还有可能读取到旧的格式的数据,如何保证这种情况下逻辑依然正确,用原生的方式就会非常麻烦。而protobuf使用optional配合默认值,可以很轻松的做版本兼容。
3. 减小体积。protobuf对数字采用了Varints编码,越小的数字占用字节越少。当然这点只对网络传输有用。
总之,因为上述的1、2两点,我们需要一个代码生成的、有schema能做版本兼容的序列化/反序列化方案,而正好有protobuf这么一个现成的满足要求,又久经考验的库,自然成为很多人的选择。
至于你贴的链接,貌似只是一个测试,比较了一下jvm下可以使用的序列化/反序列化方案的效率/性能。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-3 20:53 , Processed in 0.150938 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表