转载自:https://blog.csdn.net/xiaoxiaoyusheng2012/article/details/81102369
ProtoBuf虽然理论上效率远超JSON,但是在具体使用时,其效率受到实现者的代码质量影响。
转化效率分为两种,解码和编码,解码包括解析和对象绑定,编码包括解析和组装。就常用的几个实现了这两种格式转换的工具来说:
1. 整数或浮点数的解码和编码,ProtoBuf的效率远超JSON,明显可以发现,JSON不适合存数字,特别是DOUBLE
2. 对象解码和编码,在对象内都是字符串时,效率相差无几,甚至慢与DSL-JSON。ProtoBuf使用数字tab代替字符串格式的字段名进行内容的分发,在字段名不长的情况下,效率相差无几。
3. 整数或浮点数数组的编解码,效率相差无几。显然ProtoBuf不擅长处理数组,数字只有放在对象里才快,当然JSON在不牺牲精度的情况下,处理DOUBLE实在是太慢了。
4. 字符串编解码,由于String基于char[]而数据传递基于byte[],这个转化过程无法省略,并且存在编码格式的转换。两者效率相差不多。
总结:
编解码数字的时候,JSON仍然是非常慢的。Jsoniter 把这个差距从 10 倍缩小到了 3 倍多一些(会牺牲精度做优化)。
JSON 最差的情况是下面几种:
- 跳过非常长的字符串:和字符串长度线性相关,因为ProtoBuf会存长度,而JSON则需要线性遍历。
- 解码 double 字段:Protobuf 优势明显,是 Jsoniter的 3.27 倍,是 Jackson 的 13.75 倍。
- 编码 double 字段:如果不能接受只保留 6 位小数,Protobuf 是 Jackson 的 12.71 倍。如果接受精度损失,Protobuf 是 Jsoniter 的 1.96 倍。
- 解码整数:Protobuf 是 Jsoniter 的 2.64 倍,是 Jackson 的 8.51 倍。
如果你的生产环境中的JSON没有那么多的double字段,都是字符串占大头,那么基本上来说替换成 Protobuf 也就是仅仅比 Jsoniter 提高一点点,肯定在2倍之内。如果不幸的话,没准 Protobuf 还要更慢一点。