前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >每日一库:sonic

每日一库:sonic

作者头像
孟斯特
发布2023-10-16 19:51:46
发布2023-10-16 19:51:46
72000
代码可运行
举报
文章被收录于专栏:code人生code人生
运行总次数:0
代码可运行

sonic是一个由字节跳动开发并开源的 JSON 解析库,由 JIT (即时编译)和 SIMD (单指令流多数据流)来加速序列化/反序列化。

特色

•运行时对象绑定,无需代码生成•完备的JSON操作API•快、更快,还要快

设计实现[1]

1.针对编解码动态汇编的函数调用开销,使用 JIT 技术在运行时组装与模式对应的字节码(汇编指令),最终将其以 Golang 函数的形式缓存在堆外内存上。2.针对大数据和小数据共存的实际场景,使用预处理判断(字符串大小、浮点数精度等)将 SIMD 与标量指令相结合,从而实现对实际情况的最佳适应。3.对于 Golang 语言编译优化的不足,决定使用 C/Clang 编写和编译核心计算函数,并且开发了一套 asm2asm[2] 工具,将经过充分优化的 x86 汇编代码转换为 Plan9 格式,最终加载到 Golang 运行时中。4.考虑到解析和跳过解析之间的速度差异很大, 惰性加载机制当然也在 AST 解析器中使用了,但以一种更具适应性和高效性的方式来降低多键查询的开销

在细节上,进行了一些进一步的优化:

1.由于 Golang 中的原生汇编函数不能被内联,其成本甚至超过了 C 编译器的优化所带来的改善。所以在 JIT 中重新实现了一组轻量级的函数调用:•全局函数表+静态偏移量,用于调用指令•使用寄存器传递参数2.Sync.Map 一开始被用来缓存编解码器,但是对于准静态(读远多于写),元素较少(通常不足几十个)的场景,它的性能并不理想,所以使用开放寻址哈希和 RCU 技术重新实现了一个高性能且并发安全的缓存。

Benchmarks

sonic Benchmark结果在这里[3]。

对于所有大小的json和所有使用场景Sonic表现均为最佳

使用

以下是一个使用 Sonic 进行 JSON 解析的简单示例:

代码语言:javascript
代码运行次数:0
运行
复制
package main

import (
    "fmt"
    "github.com/bytedance/sonic"
)

func main() {
    data := []byte(`{"name":"John", "age":30, "city":"New York"}`)
    var result map[string]interface{}

    err := sonic.Unmarshal(data, &result)
    if err != nil {
        fmt.Println(err)
        return
    }

    fmt.Println(result)
}

在这个示例中,我们首先定义了一个 JSON 字符串,然后使用sonic.Unmarshal函数将其解析为一个map[string]interface{}类型的变量。

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)[4]进行许可,使用时请注明出处。 author: mengbin[5] blog: mengbin[6] github: mengbin92[7] cnblogs: 恋水无意[8]

References

[1] 设计实现: https://github.com/bytedance/sonic/blob/main/docs/INTRODUCTION_ZH_CN.md [2] asm2asm: https://github.com/chenzhuoyu/asm2asm [3] 这里: https://github.com/bytedance/sonic#benchmarks [4] 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0): https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh [5] mengbin: mengbin1992@outlook.com [6] mengbin: https://mengbin.top [7] mengbin92: https://mengbin92.github.io/ [8] 恋水无意: https://www.cnblogs.com/lianshuiwuyi/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 孟斯特 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 特色
  • 设计实现[1]
  • Benchmarks
  • 使用
    • References
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档