分享 JSON VS Protobuf

yueyoum · 2015年04月27日 · 最后由 itomato 回复于 2015年05月04日 · 6392 次阅读

https://github.com/yueyoum/playground/tree/master/Json%20VS%20Protobuf

周末两天都在搞这个东西, 手里几个项目都用的 protobuf,最初是觉得方便, 最近觉得 json 其实比 protobuf 还方便,特别是在服务端。

于是自己就对 json 和 protobuf 在打包大小,速度方面做了测试。 特别加入了 C#,因为客户端用的这个。

从客户端来看,protobuf 还是占有很大优势的。

据说 messagepack 也不错,期待楼主加入一起评测一下

#1 楼 @kiol

msgpack, flatbuffers 都研究过 感觉暂时他们对于 json, protobuf 没多少优势

http://msgpack.org/ 不错的哦,效率更高

#3 楼 @huacnlee

msgpack 以前自己稍微研究了下,没具体测试过,效率有多高?有测试数据吗?

#4 楼 @yueyoum 有的,不过没找到,没记错的话大约 10%

https://gist.github.com/joshsz/11299196

Running at 10000 times
               user     system      total        real
msgpack    0.230000   0.010000   0.240000 (  0.242138)
json       0.590000   0.030000   0.620000 (  0.630611)
protobuf   3.170000   0.040000   3.210000 (  3.256336)
 msgpack: 5.20 mb
    json: 9.78 mb
protobuf: 2.59 mb
 msgpack: 694k allocs
    json: 1240k allocs
protobuf: 2608k allocs

#5 楼 @huacnlee

比 json 快 10% 的话,感觉就没必要上 msgpack 了 因为

  • json 内置
  • 服务器用了 msgpack,客户端也要跟着用
  • 既然都要用第三方库,那还不如用 protobuf,效率更高,proto 描述文件就是文档

#6 楼 @huacnlee

从测试来看 go 的 msgpack 确实很快

但是不是因为 go 的 protobuf 库不够快?就像 python 官方的 protobuf 库一样?

LZ 感兴趣的话,可以再研究一下 Thrift。这个支持的语言更多更广。你试试。

protobuf/thrift 的 ruby/python 实现非常糟糕,完全体现不出速度来,还不如用 capnp + C 绑定

messagepack 是比 json 要快一点,但它的 js 版比 json 慢很多

没有巨大的性能差别的话,还是选择纯文本协议比较好

#9 楼 @diguage

感谢推荐,以前看过,当时感觉比 protobuf 复杂,就没再研究了

#10 楼 @luikore

纯文本协议?你指的是 json 这样 可读 格式吗?

不过现在还是觉得 protobuf 方便

  • 自动生成代码
  • 自描述文档

#12 楼 @yueyoum 是的,Unix 系统里就大量应用了文本协议而不是二进制协议,开发起来很方便

自动生成代码对动态语言没用,因为用 json 你都不用生成代码... 也就静态语言操作 json 麻烦点

#13 楼 @luikore

恩,协议格式的选择 客户端 和 服务器都要考虑。 在不同的领域,选择合适的方式 就行

#14 楼 @yueyoum 个人认为比如后台服务器直接的交互应该尽量使用同一种协议格式,这样可以方便相互调用,而且只需要填好一个协议的坑就行。

至于服务端和客户端交互,不知道现在大多数应用都是用什么协议。这块我觉得应该选择尽量能满足 App,Web、WAP 同时调用的协议格式。(这块没有实践过,不知道 Thrift/Protobuf 能否用于 App)

再给 LZ 提一点,根据我的测试,Thrift 的先后兼容性做的很不好:比如使用 thrfit(0.7.0)生产的 Java 代码,使用 0.9.0 的库就会报错。这点我觉得好坑爹!另外,还没有很好的解决办法。

另外,还有两个协议格式:

  1. Hessian Binary Web Service Protocol
  2. Welcome to Apache Avro!

希望对你有所帮助。

还有一个国人开发的交换格式。 https://github.com/hprose

需要 登录 后方可回复, 如果你还没有账号请 注册新账号