Easyjson快速JSON序列化
Easyjson用于序列化JSON數(shù)據(jù),采用Go語(yǔ)言編寫,而不是通過(guò)使用反射生成編組代碼。一個(gè)庫(kù)的目的之一是使所生成的代碼足夠簡(jiǎn)單,使得它可以容易地優(yōu)化或固定。另一個(gè)目標(biāo)是為用戶提供不可定制的“encoding/json”,如產(chǎn)生snake_case名稱或啟用默認(rèn)“omitempty“生成代碼。
用法:
go get github.com/mailru/easyjson/... easyjson -all <file>.go
這將利用編組/解組方法結(jié)構(gòu)生成<file>_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 |
編組,并發(fā)
| 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 |
