Easyjson - 快速JSON序列化


MIT
跨平台
Google Go

软件简介

Easyjson用于序列化JSON数据,采用Go语言编写,而不是通过使用反射生成编组代码。一个库的目的之一是使所生成的代码足够简单,使得它可以容易地优化或固定。另一个目标是为用户提供不可定制的“encoding/json”,如产生snake_case名称或启用默认“omitempty“生成代码。

用法:

go get github.com/mailru/easyjson/...
easyjson -all <file>.go

这将利用编组/解组方法结构生成_easyjson.go。

限制:

  • The library is at an early stage, there are likely to be some bugs and some features of ‘encoding/json’ may not be supported. Please report such cases, so that they may be fixed sooner.

  • Unsafe package is used by the code. While a non-unsafe version of easyjson can be made in the future, using unsafe package simplifies a lot of code by allowing to use ‘switch’ for filling out structs and working around limitations of standard functions like ‘strconv.ParseInt’.

  • Floats are currently formatted with default precision for ‘strconv’ package. It is obvious that it is not always the correct way to handle it, but there aren’t enough use-cases for floats at hand to do anything better.

  • During parsing, parts of JSON that are skipped over are not syntactically validated more than required to skip matching parentheses.

  • No true streaming support for encoding/decoding. For many use-cases and protocols, data length is typically known on input and needs to be known before sending the data.

解析:

lib json size MB/s allocs/op B/op
standard regular 22 218 10229
standard small 9.7 14 720
\-------- \----------- \------ \----------- \-------
easyjson regular 125 128 9794
easyjson small 67 3 128
\-------- \----------- \------ \----------- \-------
ffjson regular 66 141 9985
ffjson small 17.6 10 488
\-------- \----------- \------ \----------- \-------
codec regular 55 434 19299
codec small 29 7 336
\-------- \----------- \------ \----------- \-------
ujson regular 103 N/A N/A

编组,one goroutine

lib json size MB/s allocs/op B/op
standard regular 75 9 23256
standard small 32 3 328
standard large 80 17 1.2M
\---------- \----------- \------ \----------- \-------
easyjson regular 213 9 10260
easyjson* regular 263 8 742
easyjson small 125 1 128
easyjson large 212 33 490k
easyjson* large 262 25 2879
\---------- \----------- \------ \----------- \-------
ffjson regular 122 153 21340
ffjson** regular 146 152 4897
ffjson small 36 5 384
ffjson** small 64 4 128
ffjson large 134 7317 818k
ffjson** large 125 7320 827k
\---------- \----------- \------ \----------- \-------
codec regular 80 17 33601
codec*** regular 108 9 1153
codec small 42 3 304
codec*** small 56 1 48
codec large 73 483 2.5M
codec*** large 103 451 66007
\---------- \----------- \------ \----------- \-------
ujson regular 92 N/A N/A

编组,并发

lib json size MB/s allocs/op B/op
standard regular 252 9 23257
standard small 124 3 328
standard large 289 17 1.2M
\---------- \----------- \------- \----------- \-------
easyjson regular 792 9 10597
easyjson* regular 1748 8 779
easyjson small 333 1 128
easyjson large 718 36 548k
easyjson* large 2134 25 4957
\---------- \----------- \------ \----------- \-------
ffjson regular 301 153 21629
ffjson** regular 707 152 5148
ffjson small 62 5 384
ffjson** small 282 4 128
ffjson large 438 7330 1.0M
ffjson** large 131 7319 820k
\---------- \----------- \------ \----------- \-------
codec regular 183 17 33603
codec*** regular 671 9 1157
codec small 147 3 304
codec*** small 299 1 48
codec large 190 483 2.5M
codec*** large 752 451 77574