我在github上创建了一个Go语言序列化/反序列化库的性能比较的项目gosercomp,用来比较常见的Go语言生态圈的序列化库。
性能是以Go官方库提供的JSON/XML序列化库为基准,比较一下第三库能带来多大的性能提升。
尽管一些第三方库会自动产生Struct
的代码,我们还是都以下面的数据结构为例:
|
|
其中Colors
是一个slice。我并没有测试Struct嵌套以及循环引用的情况。
目前本项目包含了以下几种序列化库的性能比较:
- encoding/json
- encoding/xml
- github.com/youtube/vitess/go/bson
- github.com/tinylib/msgp
- github.com/golang/protobuf
- github.com/gogo/protobuf
- github.com/google/flatbuffers
- Apache/Thrift
- Apache/Avro
- andyleap/gencode
- ugorji/go/codec
对于序列化库的实现来讲,如果在运行时通过反射的方式进行序列化和反序列化,性能不会太好,比如官方库的Json和Xml序列化方法,所以高性能的序列化库很多都是通过代码生成在编译的时候提供序列化和反序列化的方法,下面我会介绍MessagePack和gencode两种性能较高的序列化库。
本项目受alecthomas/go_serialization_benchmarks项目的启发。