#json-parser #simd #serde-json #performance #port #high

无需 std simd-json

基于 simdjson 的端口的高性能 JSON 解析器

98 个版本

0.14.0-rc.22024 年 8 月 10 日
0.13.10 2024 年 4 月 15 日
0.13.9 2024 年 3 月 20 日
0.13.4 2023 年 10 月 28 日
0.1.17 2019 年 7 月 29 日

#13 in 编码

Download history 31092/week @ 2024-05-02 37118/week @ 2024-05-09 34116/week @ 2024-05-16 52953/week @ 2024-05-23 55202/week @ 2024-05-30 57910/week @ 2024-06-06 42166/week @ 2024-06-13 51265/week @ 2024-06-20 45957/week @ 2024-06-27 56255/week @ 2024-07-04 60095/week @ 2024-07-11 58836/week @ 2024-07-18 60026/week @ 2024-07-25 38393/week @ 2024-08-01 25425/week @ 2024-08-08 28634/week @ 2024-08-15

每月 165,168 次下载
150 软件包中(65 个直接使用)

Apache-2.0 OR MIT

1MB
22K SLoC

SIMD JSON for Rust ─ 构建状态 ARM 构建状态 质量 最新版本 代码覆盖率

Rust 版本的极快 simdjson JSON 解析器,具有 serde 兼容性。


readme(真正的!)

simdjson 版本

目前正在跟踪 simdjson 上游的 0.2.x 版本(正在进行中,欢迎反馈!)。

CPU 目标

要利用 simd-json,您的系统需要具备 SIMD 功能。在 x86 上,它将在运行时选择最佳的 SIMD 功能集(avx2sse4.2)。如果 simd-json 与 SIMD 支持一起编译,则将禁用运行时检测。

simd-json 支持AVX2、SSE4.2、NEON 和 simd128(wasm)。它还包括一个使用本地 rust 的非优化后备实现,用于其他平台;但是,这是一个最后的手段,我们不建议依赖它。

性能特征

  • CPU 原生 CPU 编译产生最佳性能。
  • CPU 检测 AVX 和 SSE4.2 是第二快的(仅在 x86_* 上)。
  • 当与原生 CPU 目标编译时,便携式 std::simd 是下一个快速的实现。
  • std::simd 或 rust 原生实现性能最差。

分配器

为了获得最佳性能,我们强烈建议使用 mimallocjemalloc,而不是默认使用的系统分配器。另一个表现良好的近期分配器(但我们尚未在生产环境中对其进行测试)是 snmalloc

运行时检测

此功能允许在运行时根据可用的功能选择最佳算法;它对非 x86 或 x86_64 平台没有影响。当既不支持 AVX2 也不支持 SSE4.2 时,它将回退到本机 rust 实现。

请注意,使用 runtime-detection 编译的应用程序不会像为特定 CPU 编译的应用程序那样运行得快。原因是 rust 在使用通用指令集时无法像指令集那样优化,代码的非 simd 部分也不会针对给定的指令集进行优化。

便携式

目前禁用

使用 std::simd 和 512 字节宽的寄存器实现的算法实现,目前由于依赖项而禁用,且高度实验性。

serde_impl

simd-json 与 serde 和 serde-json 兼容。提供的 Value 类型实现了序列化和反序列化。此外,simd-json 为解析器实现了 Deserializer 特性,因此它可以反序列化实现 serde Deserialize 特性的任何内容。请注意,serde 提供了 DeserializerDeserialize 特性。

话虽如此,serde 支持 contained 在 serde_impl 功能中,它是 simd-json 默认功能集的一部分,但可以禁用。

known-key

known-key 功能将底层 JSON 对象的 DOM 表示的哈希机制从 ahash 更改为 fxhashahash 哈希器在哈希速度更快,并且通过将多个键强制放入单个哈希桶中提供针对 DOS 攻击的保护。另一方面,fxhash 哈希器允许重复的哈希结果,这反过来允许对已知的键进行哈希记忆化,从而在查找上节省时间。在重负载访问一些已知的键的工作负载中,这可以是一个性能优势。

known-key 功能是可选的,默认禁用,并且应明确配置。

value-no-dup-keys

此标志对 simd-json 本身没有影响,但仅影响 Value 结构体。

value-no-dup-keys 功能标志在反序列化到 Value 对象时对对象的行为进行更严格的控制。当启用时,Value 反序列化器将删除 JSON 对象中的重复键,并仅保留最后一个。如果未设置,则重复键被视为未定义行为,Value 将不保证其行为。

big-int-as-float

big-int-as-float 特性标志将无法容纳在 u64 中的非常大的整数视为 f64 浮点数。这可以防止在解析包含非常大数字的 JSON 时出现解析错误。请注意,f64 在表示非常大的数字时可能会丢失一些精度。

安全性

simd-json 使用了大量的不安全代码。

这有几个原因:

  • SIMD 内置函数本质上是不可靠的。在 simd-json 这样的库中,这些不安全的使用是不可避免的。
  • 我们绕过了由安全 Rust 强加的一些性能瓶颈。这是可避免的,但会牺牲性能。这是 simd-json 中的一个更谨慎的方法。

simd-json 对不安全代码进行了额外的审查。这些步骤包括:

  • 单元测试 - 测试“明显的”情况、边缘情况和回归情况
  • 结构化构造性基于属性的测试 - 我们生成随机有效的 JSON 对象来随机测试整个 simd-json 代码库。由于不同的解析算法会导致这里的结果略有不同,因此目前排除了浮点数。简而言之,“simd-json 是否正确”。
  • 字符串类似数据的面向数据的基于属性的测试 - 断言合法的可打印字符序列不会使解析器崩溃(它们可能会,并且经常出错,因此 - 它们不是有效的 JSON!)
  • 破坏性基于属性的测试 - 确保没有非法的字节序列以任何方式使解析器崩溃
  • 模糊测试 - 基于上游和 jsonorg simd 通过/失败案例的模糊测试
  • Miri 测试 UB

这并不能确保完全的安全性,也不是绝对保证,但它确实在很大程度上表明,该库具有很高的生产质量,适合实际工业应用。

其他有趣的事情

还可以在此处找到上游 simdjson 的绑定 此处

许可

simd-json 本身是根据 Apache License 2.0 或 MIT 许可证许可的。

然而,它从 simdjson 中移植了大量代码,因此应尊重他们的工作和版权。

serde 集成基于他们的示例和 serde-json,因此也应尊重他们的版权。

所有感谢我们的贡献者

依赖关系

~2–14MB
~116K SLoC