98 个版本
0.14.0-rc.2 | 2024 年 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 编码
每月 165,168 次下载
在 150 个 软件包中(65 个直接使用)
1MB
22K SLoC
SIMD JSON for Rust ─
Rust 版本的极快 simdjson JSON 解析器,具有 serde 兼容性。
readme(真正的!)
simdjson 版本
目前正在跟踪 simdjson 上游的 0.2.x 版本(正在进行中,欢迎反馈!)。
CPU 目标
要利用 simd-json
,您的系统需要具备 SIMD 功能。在 x86
上,它将在运行时选择最佳的 SIMD 功能集(avx2 或
sse4.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 原生实现性能最差。
分配器
为了获得最佳性能,我们强烈建议使用 mimalloc 或 jemalloc,而不是默认使用的系统分配器。另一个表现良好的近期分配器(但我们尚未在生产环境中对其进行测试)是 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 提供了 Deserializer
和 Deserialize
特性。
话虽如此,serde 支持 contained 在 serde_impl
功能中,它是 simd-json
默认功能集的一部分,但可以禁用。
known-key
known-key
功能将底层 JSON 对象的 DOM 表示的哈希机制从 ahash
更改为 fxhash
。 ahash
哈希器在哈希速度更快,并且通过将多个键强制放入单个哈希桶中提供针对 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 许可证许可的。
- Apache License,版本 2.0(http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证(http://opensource.org/licenses/MIT)
然而,它从 simdjson 中移植了大量代码,因此应尊重他们的工作和版权。
serde 集成基于他们的示例和 serde-json
,因此也应尊重他们的版权。
所有感谢我们的贡献者
依赖关系
~2–14MB
~116K SLoC