?: 使用json.Marshal() (必须传递指向节点的指针)
APIAst.Node提供了许多有特色的API,感兴趣的朋友可以去试一下 。
- 合法性检查:Check(), Error(), Valid(), Exist()
- 索引:Index(), Get(), IndexPair(), IndexOrGet(), GetByPath()
- 转换至 go 内置类型:Int64(), Float64(), String(), Number(), Bool(), Map[UseNumber|UseNode](), Array[UseNumber|UseNode](), Interface[UseNumber|UseNode]()
- go 类型打包:NewRaw(), NewNumber(), NewNull(), NewBool(), NewString(), NewObject(), NewArray()
- 迭代:Values(), Properties(), ForEach(), SortKeys()
- 修改:Set(), SetByIndex(), Add()
拷贝字符串当解码 没有转义字符的字符串时,sonic 会从原始的 JSON 缓冲区内引用而不是复制到新的一个缓冲区中 。这对 CPU 的性能方面很有帮助,但是可能因此在解码后对象仍在使用的时候将整个 JSON 缓冲区保留在内存中 。实践中我们发现,通过引用 JSON 缓冲区引入的额外内存通常是解码后对象的 20% 至 80%,一旦应用长期保留这些对象(如缓存以备重用),服务器所使用的内存可能会增加 。我们提供了选项 decoder.CopyString() 供用户选择,不引用 JSON 缓冲区 。这可能在一定程度上降低 CPU 性能
func base() {// 在sonic.Config中进行配置 snc := sonic.Config{CopyString: true, }.Froze()}传递字符串还是字节数组为了和 encoding/json 保持一致,我们提供了传递 []byte 作为参数的 API,但考虑到安全性,字符串到字节的复制是同时进行的,这在原始 JSON 非常大时可能会导致性能损失 。因此,你可以使用 UnmarshalString() 和 GetFromString() 来传递字符串,只要你的原始数据是字符串,或零拷贝类型转换对于你的字节数组是安全的 。我们也提供了 MarshalString() 的 API,以便对编码的 JSON 字节数组进行零拷贝类型转换,因为 sonic 输出的字节始终是重复并且唯一的,所以这样是安全的 。
零拷贝类型转换是一种技术,它允许你在不进行实际数据复制的情况下,将一种数据类型转换为另一种数据类型 。这种转换通过操作原始内存块的指针和切片来实现,避免了额外的数据复制,从而提高性能并减少内存开销.
需要注意的是,零拷贝类型转换虽然可以提高性能,但也可能引入一些安全和可维护性的问题,特别是当直接操作指针或内存映射时 。
性能优化在 完全解析的场景下, Unmarshal() 表现得比 Get()+Node.Interface() 更好 。
func base() { data := `{"name": "z3","info":{"num": [11,22,33]}}` // complete parsing m := map[string]interface{}{} sonic.Unmarshal([]byte(data), &m)}但是如果你只有特定 JSON的部分模式,你可以将 Get() 和 Unmarshal() 结合使用:func base() { data := `{"name": "z3","info":{"num": [11,22,33]}}` // complete parsing m := map[string]interface{}{} sonic.Unmarshal([]byte(data), &m) // partial parsing clear(m) node, err := sonic.GetFromString(data, "info", "num", 1) if err != nil {panic(err) } log.Println(node.Raw())}原文链接https://juejin.cn/post/7271429136659791907相关资料[1]https://en.wikipedia.org/wiki/Jit: https://en.wikipedia.org%2Fwiki%2FJit
[2]https://github.com/chenzhuoyu/asm2asm: https://github.com%2Fchenzhuoyu%2Fasm2asm
本文转载自微信公众号「 程序员升级打怪之旅」,作者「 Shyunn&王中阳Go」
【Sonic: Go语言的超级JSON库,解析与编码速度狂飙】
推荐阅读
- EasyNetQ库:让你的分布式系统消息开发快人一步!
- C# 中的 ref 已经被放开,或许你已经不认识了
- Oracle数据库分区技术:优化大型数据集的存储效率!
- Docker容器中的Postgresql备份脚本异常解决办法
- 目前有哪些比较成功的人工智能应用?
- 为什么色准越高的显示设备就越贵
- AI要被卡脖子了?训练大模型的数据或在2026年耗尽
- 什么是知识图谱
- 什么是智能网联技术
- AI可以读取人心了 心中的小秘密还能藏多久?
