maltadirk 发表于 2021-10-14 06:54

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

Protobuf好像本身有压缩,在通讯的时候还有必要再加一遍压缩算法吗?压缩效果好不好?

ainatipen 发表于 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,还是有必要再进行一遍压缩。

KaaPexei 发表于 2021-10-14 07:07

protobuf本身没什么压缩,但是数据表示还算是紧凑。
至于你要不要压缩,实际上取决于你要发送的数据的特性和使用的场景。
如果数据中大量文本,那么压缩还是有好处的。否则意义不大
当然你要损失压缩和解压消耗的CPU
所以还请自己衡量。

当然如果这个接口是暴露给别人用的,还是不要搞什么压缩比较好

NoiseFloor 发表于 2021-10-14 07:17

看场景,如果你们单条数据体积较大,按我的经验是10KB以上,那么有一点效果,如果体积达到几百KB甚至级MB,那么压缩的效果非常明显。
推荐使用Zstd和LZ4这两种压缩算法,比gzip这种古老的压缩算法CPU开销小很多,压缩率也非常不错。

rustum 发表于 2021-10-14 07:18

protobuf内部对值采用了变长编码,已经有一定的压缩了。
虽然可能压缩率没有gzip算法高,但没必要再压一次了。

zifa2003293 发表于 2021-10-14 07:21

这种问题要在知乎上问吗?
不应该根据你自己的使用方式,把典型的消息都找来,测压缩率,测CPU时间,然后做决定吗?
简单的说,消息越小,不好的可能性越大;消息越大,好的可能性越大。
如果文本多,而且能总结出常用词语,用它们初始化字典,可以提高压缩率。

jquave 发表于 2021-10-14 07:25

有看到过用zlib压缩的
页: [1]
查看完整版本: 通讯使用Protobuf,还有必要再做一遍压缩吗?