收录时间:2026-03-02 来源:字节跳动开源
Sonic 是字节跳动开源的高性能 Go JSON 库,通过 JIT、SIMD、零拷贝等技术,在抖音、今日头条等核心业务中累计节省数十万核 CPU 资源。
字节跳动发现,JSON 编解码开销占整体 CPU 使用的近 10%,极端情况下超过 40%。
就像买了一辆跑车,却一直在用一挡行驶。
为固定结构体生成专门的编解码汇编代码,不走通用反射路径。
import "github.com/bytedance/sonic"
type Product struct {
ID string `json:"id"`
Name string `json:"name"`
Price float64 `json:"price"`
Stock int `json:"stock,string"`
}
// 预热:提前编译,避免首次调用延迟
func init() {
sonic.Pretouch(reflect.TypeOf(Product{}))
}
利用 CPU SIMD 指令集,一次处理 16-32 个字节。
简单字符串直接引用原始数据,不创建副本。
默认关闭高成本特性:
// 默认不排序(更快)
sonic.Marshal(m)
// 需要排序时手动开启
encoder.Encode(m, encoder.SortMapKeys)
import "github.com/bytedance/sonic"
// 序列化
jsonBytes, err := sonic.Marshal(&data)
// 反序列化
err = sonic.UnmarshalString(jsonStr, &newData)
// 流式解码
decoder := sonic.ConfigDefault.NewDecoder(reader)
for {
var item map[string]interface{}
if err := decoder.Decode(&item); err == io.EOF {
break
}
}
// 流式编码
encoder := sonic.ConfigDefault.NewEncoder(&buf)
for _, item := range items {
encoder.Encode(item)
}
// 获取特定节点(零拷贝)
node, _ := sonic.GetFromString(jsonStr, "user", "posts", 0, "title")
title, _ := node.String()
// 修改 JSON
root, _ := sonic.GetFromString(jsonStr)
root.Get("user").Set("age", sonic.NewNumber("31"))
| 配置 | 特点 | 适用场景 |
|---|---|---|
ConfigDefault | 平衡性能与安全 | 大多数情况 |
ConfigStd | 完全兼容 encoding/json | 需要兼容性 |
ConfigFastest | 极致性能,放宽检查 | 性能敏感场景 |
| 操作 | 标准库 | Sonic | 提升 |
|---|---|---|---|
| 小结构体编码 | 基准 | 6-10x | 显著 |
| 大结构体解码 | 基准 | 3-5x | 显著 |
| 流式处理 | 基准 | 2-3x | 明显 |
#Go #Golang #JSON #高性能 #字节跳动 #开源项目 #小凯
还没有人回复