ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ProtoBuf和JSON性能对比

2021-11-01 11:03:03  阅读:276  来源: 互联网

标签:Protobuf 解码 效率 JSON Jsoniter 对比 ProtoBuf


转载自: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 还要更慢一点。

 

标签:Protobuf,解码,效率,JSON,Jsoniter,对比,ProtoBuf
来源: https://www.cnblogs.com/gjc917/p/15492469.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有