找回密码
 立即注册
查看: 302|回复: 6

通讯使用Protobuf,还有必要再做一遍压缩吗?

[复制链接]
发表于 2021-10-14 06:54 | 显示全部楼层 |阅读模式
Protobuf好像本身有压缩,在通讯的时候还有必要再加一遍压缩算法吗?压缩效果好不好?
发表于 2021-10-14 07:00 | 显示全部楼层
protobuf的 string 类型和byte类型是直接存储的。整型相关类型是采用的变长编码。具体可以查看文档:
https://developers.google.com/protocol-buffers/docs/encoding#structure

压缩的话跟使用的压缩算法或者说压缩库有关系。
如果是zlib的话其基本的压缩方式huffman coding:
DEFLATE
跟protobuf的varint编码方式并不冲突,也就是说还是可以达到压缩的效果。
zlib的默认压缩方式(最高压缩率)比较耗cpu,所以需要权衡一下,如果拿不准的话可以使用snappy,cpu消耗会少很多(数量级),当然压缩率也会对应下降。
具体压缩率没做过测算,不过经验上来看对于一定大小的数据(100byte以上)压缩效果还是比较明显的。

综合来讲,对于大一点的数据,即使使用了protobuf,还是有必要再进行一遍压缩。
发表于 2021-10-14 07:07 | 显示全部楼层
protobuf本身没什么压缩,但是数据表示还算是紧凑。
至于你要不要压缩,实际上取决于你要发送的数据的特性和使用的场景。
如果数据中大量文本,那么压缩还是有好处的。否则意义不大
当然你要损失压缩和解压消耗的CPU
所以还请自己衡量。

当然如果这个接口是暴露给别人用的,还是不要搞什么压缩比较好
发表于 2021-10-14 07:17 | 显示全部楼层
看场景,如果你们单条数据体积较大,按我的经验是10KB以上,那么有一点效果,如果体积达到几百KB甚至级MB,那么压缩的效果非常明显。
推荐使用Zstd和LZ4这两种压缩算法,比gzip这种古老的压缩算法CPU开销小很多,压缩率也非常不错。
发表于 2021-10-14 07:18 | 显示全部楼层
protobuf内部对值采用了变长编码,已经有一定的压缩了。
虽然可能压缩率没有gzip算法高,但没必要再压一次了。
发表于 2021-10-14 07:21 | 显示全部楼层
这种问题要在知乎上问吗?
不应该根据你自己的使用方式,把典型的消息都找来,测压缩率,测CPU时间,然后做决定吗?
简单的说,消息越小,不好的可能性越大;消息越大,好的可能性越大。
如果文本多,而且能总结出常用词语,用它们初始化字典,可以提高压缩率。
发表于 2021-10-14 07:25 | 显示全部楼层
有看到过用zlib压缩的
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-24 18:32 , Processed in 0.095457 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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