https://github.com/bytedance/sonic 采用 JIT (just-in-time compiling) and SIMD (single-instruction-multiple-data) 技术,对json的编码和解码进行了加速。首先通过例子看下它如何使用:
代码语言:javascript复制package main
import (
"bytes"
"fmt"
"strings"
"github.com/bytedance/sonic"
"github.com/bytedance/sonic/decoder"
"github.com/bytedance/sonic/encoder"
)
type YourSchema struct {
}
func main() {
var data YourSchema
// Marshal
output, err := sonic.Marshal(&data)
fmt.Println(err)
// Unmarshal
err = sonic.Unmarshal(output, &data)
fmt.Println(err)
var o1 = map[string]interface{}{
"a": "b",
}
var o2 = 1
var w = bytes.NewBuffer(nil)
var enc = encoder.NewStreamEncoder(w)
enc.Encode(o1)
enc.Encode(o2)
println(w.String()) // "{"a":"b"}n1"
var o = map[string]interface{}{}
var r = strings.NewReader(`{"a":"b"}{"1":"2"}`)
var dec = decoder.NewStreamDecoder(r)
dec.Decode(&o)
dec.Decode(&o)
fmt.Printf("% v", o) // map[1:2 a:b]
}
可以看到,它基本上兼容官方的json Marshal UnMarshal api,但是HTML 转义处理有些许不同,默认不开启html Escape,因为会造成约15%的性能损耗。json-iterator,在泛型编解码、大数据量级场景下的性能也会下降。
sonic的核心技术点就是使用C语言编写热点操作,使用Clang的深度优化编译选项编译后供golang调用。 直接编译出来,减少了函数调用的开销。 由于clang编译出来的是x86汇编,而golang编译出来的是plan9汇编。为了在golang中调用clang编译出来的汇编,字节开发了一个工具(tools/asm2asm)将x86的汇编转换为plan9。