写项目一直需要进行序列化,听到了,也看到了很多同学老师对各个golang的<code>json</code>库进行测评。那本人为什么还要继续进行这一次测评呢?
因为实践过的知识最有说服力,也是属于自己的,我也希望看到本博文的同学老师可以修改和执行测评的代码执行一遍,我相信会有不一定的体会。
本次测评我选择了类库有:
序号
类库
地址
备注
1
encoding/json
Golan
2
easyjson
github.com/mailru/easyjson
3
ffjson
4
iterator/json
github.com/json-iterator/go
主要是针对上述的类型进行,本人采用了对不同的类库使用不同的结构体(仅仅是结构体名称不同,字段顺序和类型一样)。
环境为MacBook Pro(Core i5处理器/8GB内存)go1.8.3 darwin/amd64
bench代码如下:
执行命令:
测评结果;
哪一个类库最快?
答:是测评类库中最快的。速度:easyjson => iterator => encoding/json => ffjson
是否存在坑?
答:<code>easyjson</code>有一个坑,从代码中可以看到<code>Benchmark_EASYJSON_STD_*</code>的方法,是因为easyjson生成的代码中已经包含了<code>MarshalJSON</code>和<code>UnmarshalJSON</code>方法,那么只要对这些结构体执行<code>json.marshalJSON</code>和<code>json.UnmarshalJSON</code>都会默认调用easyjson生成的方法。本人运行多次,都会发现调用easyjson生成的<code>MarshalJSON</code>方法比标准库中的慢一些达到50%左右,但是调用<code>easyjson</code>生成的<code>UnmarshalJSON</code>比标准库的快一些大概20%。
如何选择?
答:<code>easyjson</code>速度虽然比较快,但也是存在一些不适合的场景,比如如果需要对<code>interface</code>接口进行序列化时候。所以建议采用<code>easyjson</code>与标准库结合。
本文转自 梦朝思夕 51CTO博客,原文链接:http://blog.51cto.com/qiangmzsx/2070603