golang源码分析:sonic

2023-09-06 19:18:59 浏览数 (1)

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。

0 人点赞