简介
Protobuf是google提出的数据交换格式。其需要高压缩传输及解析数据的场景中, 可以考虑用protobuf 取代 json/xml。google 官方测试报告显示,同一条消息数据,protobuf 序列化后占用空间是 json 的 1/10,xml 的 1/20,但性能却是几十倍。
在我工作过程中,曾经遇到过这种场景: 客户端启动时需从服务端下载一份100MB+的 XML 数据解析并转化为SQL数据存储。 如此大的XML文本文件下载/解析时间以及内存占用都很高。我们为优化切换成 protobuf 格式,通过mac 平台上编译的一份oc实现的 protobuf 源码,实测下载的数据集降低到 10Mb 左右,解析速度500毫秒,相较原XML有十倍以上的提升,并且内存占用也大大降低了。
protobuf为什么体各小解析快呢?
-
编解码大多采用位移运算,比 JSON/XML 的字符匹配效率高
-
pb定义了Varint 类型,使用变长编码压缩数值类型。 简单来说,值越小的数字,使用越少的字节数表示 。负数通过 zigzag 编码实现用无符号数表示有符号数,对负数数据可以更好的压缩。
-
采取 Tag-Value (Varint 类型)或 Tag-Length-Value(字符串或其他对象类型),无 json 或 xml 内冗余字符。由于tag只有一个字节,其性能开销很小。
如果数据内包含较多数值类型(int/double/float),用 pb 可以大大降低尺寸并提升解析性能。 如果数据中有较多字符串对象,性能提升相对有限。