protobuf为什么快(Protobuf性能到底有没有比JSON快5倍)

本文目录
Protobuf性能到底有没有比JSON快5倍
直接利用python提供的json包,在django model的定义中增加一个方法toJSON,利用django model 能访问 _meta.fields 得到相关属性而得到,例子如下:
class Category(models.Model):
autoid = models.AutoField(primary_key=True)
email=models.CharField(max_length=150,blank=False)
comtype=models.CharField(max_length=20,blank=False)
catname=models.CharField(max_length=150,blank=False)
def __unicode__(self):
return ’%s’ % (self.catname)
def toJSON(self):
import json
return json.dumps(dict())
然后用django查出数据,并转换成json,代码如下:
row=models.Category.objects.get(autoid=23)
google的protobuf比这样java原生的方式更有效率吗
在这种简单的情况下,肯定是你写的这种原生的更快,内存使用也更少
但是protobuf不止是简单的解决单一的、不变的序列化/反序列化,他关注的重点在:
1. 确保正确。原生的方式如果纯手写,那么必须保证每个字段读写的大小、顺序都一致,而如果类一多,对人脑是个很大的负担。所以用代码生成代码的方式,减轻人脑的负担就是更好的选择。
2. 高版本兼容低版本。如果你的数据类成员不是一成不变的,而是随着业务的扩大会不断的新增,而旧有的数据不能在升级的同时立即转换为新的格式,也就是说新增了数据类成员,改变了读取逻辑之后,你的程序还有可能读取到旧的格式的数据,如何保证这种情况下逻辑依然正确,用原生的方式就会非常麻烦。而protobuf使用optional配合默认值,可以很轻松的做版本兼容。
3. 减小体积。protobuf对数字采用了Varints编码,越小的数字占用字节越少。当然这点只对网络传输有用。
总之,因为上述的1、2两点,我们需要一个代码生成的、有schema能做版本兼容的序列化/反序列化方案,而正好有protobuf这么一个现成的满足要求,又久经考验的库,自然成为很多人的选择。
至于你贴的链接,貌似只是一个测试,比较了一下jvm下可以使用的序列化/反序列化方案的效率/性能。
protobuf适不适合物联网
最关键的问题来自如下几点:1、难于调试:都是二进制协议,序列化后的内容不可读2、安装繁琐恶心:都要安装很久,编译一堆东西3、对多语言支持有限:最近几年新语言出的太快了4、对WEB不友好:js没有原生支持所以,逐渐就不用了。现在遇到类似的需求都是用HTTP里面封装JSON的。所以调用的请求用form提交,这样用网页上的表单就能模拟。返回的是一个dict,其中errnum表示错误码,0为成功。errmsg为错误信息,方便客户端调试。result为实际返回的数据。这样的方式调试方便,兼容性好。虽然慢了不少,但其实人的效率更重要。
protobuf测试gofast
gogoprotobuf有两个插件可以使用
protoc-gen-gogo:和protoc-gen-go生成的文件差不多,性能也几乎一样(稍微快一点点)
protoc-gen-gofast:生成的文件更复杂,性能也更高(快5-7倍)
这里只是简单的用go test测试了一下

更多文章:
在from子句中可以出现(如何在from 子句中嵌套查询下面的语句在access中出错!)
2026年10月11日 05:20
countif函数统计个数怎么用(countif函数怎么用 详解Excel中countif函数的使用方法)
2026年10月11日 03:30
正则匹配数字之前的字符(正则表达式如何匹配前面是数字、中间是“/”、后面也是数字,就像2/3专业的模式)
2026年10月11日 03:00
orlnsertbootmediinselected(我电脑开机显示这个是什么意思or insert boot media in select)
2026年10月10日 23:00
display的用法(display是什么意思 详解display的含义和用法)
2026年10月10日 22:00
html全部居中代码(怎么让网页居中显示,html如何让网页居中)
2026年10月10日 21:10





