今天有同事问我,使用protobuf 作为通信协议之后,是否还需要压缩呢。
其实我们知道,protobuf 为了节省字节数,本身已经做了一些处理,例如 采用 Varint 编码,ZigZag编码,Length-delimited编码等,并且对repeated的字段提供了packed的处理,其实已经算做了优化了,但是,如果你的数据量很大的话,其实是可以在继续使用压缩算法去压缩的,因为压缩的话,要在cpu消耗和流量之间做一个权衡,一般来说,小消息就没必要了,当消息达到一定程度(例如100byte以上),压缩还是有效果的, 一般压缩的话,zlib压缩效率是最高的,但是比较消耗cpu, 一般我是采用snappy,虽然压缩效率不高,但是它在cpu消耗和压缩效率之前的权衡做的比较合理。
这几篇关于protobuf原理的文章将的挺好,有兴趣的可以读读。
https://developers.google.com/protocol-buffers/docs/encoding#structure
https://blog.csdn.net/zxhoo/article/details/53228303
http://www.okyes.me/2016/09/10/protobuf-encode.html