Json VS Protobuf

2015 年 4 月 27 日
 yueyoum
https://github.com/yueyoum/playground/tree/master/Json%20VS%20Protobuf

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

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

从客户端来看, protobuf 还是占有很大优势的。
14249 次点击
所在节点    程序员
43 条回复
327beckham
2015 年 4 月 27 日
果断protobuf,在后期的扩展性来说,比json好。
dcoder
2015 年 4 月 27 日
觉得直接 JSON 方便很多, 特别是如果你 server 端的基本都是用 JSON 交流和存储数据的话

还有, 你 C# 用了 newtonsoft 的 JSON 了吗? 比官方的 JSON 效率高, 很多人用这个的
http://www.newtonsoft.com/json
dcoder
2015 年 4 月 27 日
翻了下lz的github项目, 猜测你是在用 C# for Mono&Unity3d
你使用的是 LitJson 作为Json库

我觉得最好的 JSON库 for Mono&Unity3d 是这个:
https://www.assetstore.unity3d.com/en/#!/content/11347

虽然有一次性的 $25 收费, 不过买到的是带源码的,
这个plugin作者忠实地移植了.NET community评价最好的 newtonsoft 的 JSON 库
znoodl
2015 年 4 月 27 日
可读上json强,楼主再比下msgpack
patrickstar
2015 年 4 月 27 日
我现在需要追求性能,毫不犹豫得选择了protobuf,正在实施
EPr2hh6LADQWqRVH
2015 年 4 月 27 日
传输protobuf, 存储bson, 公开API json
hewigovens
2015 年 4 月 27 日
clino
2015 年 4 月 27 日
@znoodl 感觉msgpack可读性也不好哈,不过感觉比 protobuf 简单
garfeildma
2015 年 4 月 27 日
clino
2015 年 4 月 27 日
楼主加个msgpack的到测试里看看?

另外看结果比较奇怪的是,为什么python版的protobuf比json反而会慢这么多?
amycs
2015 年 4 月 27 日
@avastms 传输也用 bson 的话有什么问题么?
EPr2hh6LADQWqRVH
2015 年 4 月 27 日
@amycs 因为要传key值所以效率不如protobuf
yueyoum
2015 年 4 月 27 日
@dcoder

感谢 推荐, JSON.NET 已经加入我的 unity wish list了, 不过还没购买
yueyoum
2015 年 4 月 27 日
@znoodl
@clino

msgpack 以前也试过, 感觉不到它的优势

比json / bson 并没有多大优势。 反而又多了一个 私有协议。
yueyoum
2015 年 4 月 27 日
@hewigovens

flatbuffers 也关注过, 但是目前 支持的语言太少, 比如就没有 erlang binding

我暂时也没时间去自己写一个。


还是用用其他现成,成熟的吧
yueyoum
2015 年 4 月 27 日
@clino

至于 python 的 protobuf 比 json 慢,
是因为 以前看别人也说过 官方的 protobuf 库 效率很低, 但没说有多低。

我也是一测,才发现居然这么慢。。。
yueyoum
2015 年 4 月 27 日
@avastms

> 因为要传key值所以效率不如protobuf

你是指 bson 吗?


没明白这句话的意思 ,求详解
clino
2015 年 4 月 27 日
@yueyoum msgpack的效率不够好?
应该也不会多一个私有协议,如果用应该也是替换掉protobuf吧,msgpack和protobuf应该都算私有的?
yueyoum
2015 年 4 月 27 日
@clino

恩, 我的意思是
1. msgpack 和 json 一样, 不用先定义 协议描述, 直接 序列化/反序列化就行.

那么此时 json是内置的, msgpack 还要安装第三方库。 这时候就没有json 方便了。

2. protobuf 和 msgpack 都要安装第三方库. protobuf 的定义文件,就是协议文档。
在多人合作开发的时候 有优势。 json 和 msgpack 还要自己再写一边文档。
est
2015 年 4 月 27 日
效率高,还可以考虑用一个非主流的格式叫做 tnetstring

https://pypi.python.org/pypi/tnetstring

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://study.congcong.us/t/186561

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX