QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

高性能 Rust JSON 库 sonic-rs 优化实践

  • 2024-03-26
    北京
  • 本文字数:2008 字

    阅读完需:约 7 分钟

大小:904.33K时长:05:08
高性能 Rust JSON 库 sonic-rs优化实践

一、sonic-rs 介绍

sonic-rs 是一个基于 SIMD 的高性能 Rust JSON 库,是 sonic JSON 库的 Rust 版本。


字节跳动 sonic 开源项目如今包含了不同语言的多个 JSON 库(如下)。其中,sonic-go 最先开源,使用了 JIT 和 SIMD 技术,sonic-cpp 使用了 C++ 模板和 SIMD 技术,这两个 JSON 库均已经在字节内部得到了较大规模的落地。在成本优化大背景下,为了帮助 Golang 业务迁移 Rust,优化 Rust JSON 性能,我们基于 JSON 方面的优化经验和实践,用纯 Rust 语言开发了高性能的 JSON 库  sonic-rs。


  • sonic(Golang JSON 库):https://github.com/bytedance/sonic

  • sonic-cpp(C++ JSON 库):https://github.com/bytedance/sonic-cpp

  • sonic-rs(Rust JSON 库):https://github.com/cloudwego/sonic-rs


sonic-rs 目前支持的 JSON 功能比较齐全,基本对齐了 serde-json 的相关功能,并且提供更加丰富的功能和更多的高性能接口。sonic-rs 的主要功能特点有:


  • 基本兼容 Serde 生态,同时支持 Volo 中的 FastStr 类型

  • 支持动态类型编解码和按需解析

  • 支持 LazyVaue,RawNumber 等类型

  • 支持 UTF-8 校验和标准浮点数精度


在性能方面,我们基于 serde-rs 官方 benchmark (https://github.com/serde-rs/json-benchmark) 提供的 Rust 结构体和 JSON 数据,对 serde-json, simd-json 和 sonic-rs 在 Rust 结构体下的解析性能进行了测试,可以发现 sonic-rs 的性能是 simd-json 的 1.5~2 倍,是 serde-json 2 倍:


二、sonic-rs 优化实践


sonic-rs 的优化主要基于 SIMD,其中部分借鉴了其他 JSON 库,如 simd-json 的优化思路。SIMD (Single instruction, multiple data) 是一种并行优化技术,可以用一条指令,并行处理多个数据。如今大多数 CPU 已经支持了各种 SIMD 指令集。例如,x86_64 架构下的 SSE,AVX2,AVX512, aarch64 架构下的 neon 指令集等。使用 SIMD 指令优化之后,对于合适的任务,程序执行的指令数量会更少,因此性能会更好。


在整体设计上,sonic-rs 并没有采用 simd-json 那种二阶段解析的思路,主要将 SIMD 优化应用于 JSON 解析和序列化中的热点,包括字符串序列化、按需解析和浮点数解析等。

1. SIMD 优化字符串序列化


字符串序列化是 JSON 序列化的热点。序列化时,需要扫描字符串中的转义字符。对于较长的字符串,逐个字节判断转义字符的操作是比较耗时的,扫描转义字符非常适合使用 SIMD 来加速。


如果用 AVX2 指令来扫描转义字符,如下面代码所示。这段 SIMD 代码在 haswell 架构下面,开 O3 优化之后,其实只有六条 SIMD 指令,即 6 条 SIMD 指令可以一次性扫描 32 个字节。相比较标量代码来说,大大减少了程序指令的数量,从而减少了程序的执行时间。


2. SIMD 优化按需解析


很多业务场景只用到 JSON 中的部分字段,很适合按需解析,在解析时跳过不需要的 JSON 字段。在跳过 JSON 字段时,难点在于如何高效跳过 JSON 中的 object 和 array。


基于 JSON 中 object 和 array 括号必须匹配的语法规则,sonic-rs 使用 SIMD 实现了高效的括号匹配算法。先通过 SIMD 得到 json object 和 array 的 bitmap,然后通过计算括号的数量来跳过 object 和 array。当发现括号匹配时,就可以跳过该 object 或 array。


3. SIMD 优化浮点数解析


浮点数解析是 JSON 解析中的一个性能热点。在字节内部,我们发现 JSON 中大部分浮点数的尾数都比较长,也适合使用 SIMD 优化。如下图,对于一段长 16 个字节的浮点数尾数 "1234342112345678":


  • 先将这段字符串读取到向量寄存器里面,此时向量的每个数字还是 ASCII 码的值。

  • 其次,用向量的减法,逐个字节减去 ASCII 码 '0' 得到 v1。这时。v1 里面的数字已经是十进制。

  • 然后,继续对 v1 里面的各个数字用向量指令做两两乘加(高位乘以 10 再加上低位),得到 v2。v2 里面的各个数已经是十进制的两位数。

  • 以此类推,利用 SIMD 指令逐层累加,最终就得到 v16。v16 里面是一个 16 位数,即最终的尾数解析结果。

  • 最后,我们再用向量指令把 v16 转成 u64 类型。


整个解析过程,不用遍历浮点数尾数的每一个字符,就能完成浮点数尾数解析。


三、sonic-rs 现状和规划


sonic-rs 已经开源几个月了,目前迭代到了 0.3 版本,已经支持 Rust stable 版本,并且支持了 aarch64 架构。sonic-rs 沉淀了一些使用文档,用以帮助各方面的开发者:


  • Golang 迁移 Rust 用户使用 sonic-rs:https://github.com/cloudwego/sonic-rs/blob/main/docs/for_Golang_user_zh.md

  • Rust serde-json 用户迁移 sonic-rs:https://github.com/cloudwego/sonic-rs/blob/main/docs/serdejson_compatibility.md

  • 性能优化细节:https://github.com/cloudwego/sonic-rs/blob/main/docs/performance_zh.md


后续,sonic-rs 会在性能,易用性和稳定性上面继续打磨,预期会支持对 Bytes/FastStr 等常见数据类型的零拷贝解析,支持运动时检测 SIMD 指令等,欢迎感兴趣的开发者一起加入我们。


项目地址

GitHub:https://github.com/cloudwego

官网:www.cloudwego.io

2024-03-26 17:074034

评论

发布
暂无评论
发现更多内容

OceanBase数据库结合ETLCloud快速实现数据集成

RestCloud

数据库 分布式存储 ETL 数据集成 oceanbase

Google 类 Computer Use 项目:贾维斯计划;字节 PersonaTalk 视频配音框架能保持口型与风格同步

声网

Pixabay API集成:免费获取图片和视频的步骤详解

幂简集成

API 图片

技术解析丨加速高性能计算,RDMA 在分布式存储中的性能优化实践

焱融科技

AI 高性能存储 RDMA MLPerf

EasyRecovery破解版下载无需注册,easyrecovery数据恢复软件免费版激活码密钥

阿拉灯神丁

Easyrecovery破解 恢复软件 数据恢复软件 EasyRecovery16 破解软件

如何在mac上玩使命召唤手游?苹果电脑好玩的第一人称射击游戏推荐

阿拉灯神丁

游戏 兼容性 苹果电脑 使命召唤5 CrossOver Mac下载

淘宝商品评论API返回值中的物流与评价关联分析

技术冰糖葫芦

API 接口 API 测试 API】 API 协议

DevSecOps在数字政府建设中的实践研究

不在线第一只蜗牛

大数据 DevSecOps

AI安全智能体,重塑网络安全新范式

云起无垠

有人问我:过去一年用 AI 写了多少代码

阿里巴巴云原生

阿里云 云原生 通义灵码

有人问我:过去一年用 AI 写了多少代码

阿里云云效

阿里云 云原生 通义灵码

天谋科技成为先进操作系统创新联盟智能制造协同创新实验室成员单位,出席揭牌仪式

Apache IoTDB

豆包MarsCode AI 红人创造营启动,参与活动赢万元现金激励!

豆包MarsCode

10分钟搞定软件架构决策

俞凡

架构

华为校园鸿蒙公开课走进清华大学

最新动态

鸿蒙开发案例:巧算24点

zhongcx

技术分享 | 大语言模型增强灰盒模糊测试技术探索

云起无垠

望繁信科技出席2022浦东国际人才港论坛,获颁最具潜力的海归创业团队大奖

望繁信科技

数字化转型 流程挖掘 流程资产 流程智能 望繁信科技

AI 原生时代,更要上云:百度智能云云原生创新实践

Baidu AICLOUD

云原生 智能化 大模型

RabbitMQ的Overview Totals是空

codists

RabbitMQ 编程人 codists

现在才投简历还来得及吗?

王磊

OPPO式出海,为全球化讲一个“落地生根”的故事

脑极体

AI

高性能 Rust JSON 库 sonic-rs优化实践_编程语言_刘强_InfoQ精选文章