背景:
由于项目中大量使用Json的转换工作,但是发现官方包在大量的转换过程中效率是很低的,下面以实际情况进行验证:
1. json官方包
type NumberRange struct {
Min int `json:"min"`
Max int `json:"max"`
}
func Benchmark1Pro1(b *testing.B) {
s := "{\n \"deviceDataType\":\"int\",\n \"body\":{\n \"min\":16,\n \"max\":30\n }\n}"
for i := 0; i <= b.N; i++ {
var n NumberRange
jsoniter.Unmarshal([]byte(gjson.Get(s, "body").String()), &n)
fmt.Println(n)
}
}
输出结果:
Benchmark1Pro1-12 26982 46717 ns/op
PASS
2. 下面就是推荐使用的:"github.com/json-iterator/go" (jsoniter)
type NumberRange struct {
Min int `json:"min"`
Max int `json:"max"`
}
func Benchmark1Pro1(b *testing.B) {
s := "{\n \"deviceDataType\":\"int\",\n \"body\":{\n \"min\":16,\n \"max\":30\n }\n}"
for i := 0; i <= b.N; i++ {
var n NumberRange
json.Unmarshal([]byte(gjson.Get(s, "body").String()), &n)
fmt.Println(n)
}
}
输出结果:
Benchmark1Pro1-12 27674 43109 ns/op
PASS
结论:
从上面相同的需求Json转换可以看出来,jsoniter的性能更高,在和官网json包比较可以看出,每次快3000ns。