9 个版本
0.2.1 | 2024 年 7 月 24 日 |
---|---|
0.2.0 | 2024 年 4 月 26 日 |
0.1.6 | 2024 年 4 月 25 日 |
384 在 文本处理
每月 157 次下载
115KB
2.5K SLoC
Swift Check
Swift Check 是一个健壮的高性能库,通过表达性条件进行数据搜索和验证。
支持的加速
- x86_64 (SSE2 和可选 SSE4.1)
- aarch64 (NEON)
- WASM (simd128)(目前需要
experimental
功能)
安装
通过在 Cargo.toml 中包含它将 Swift Check 添加到您的项目中
[dependencies]
swift-check = "0.2.1"
快速开始
使用此库相对简单,swift-check
提供了各种条件,可以组合在一起创建复杂和高效的搜索/验证器。
搜索第一个逗号
use swift_check::{search, eq};
fn main() {
let input = b"hello, world!";
let Some(first_comma) = search(input, eq(b',')) else {
unreachable!("There's a comma!")
};
assert_eq!(input[first_comma], b',');
}
确保每个字节都是字母、数字或空格
use swift_check::{for_all_ensure, any, range, eq};
fn main() {
let input = b"Hello World 12345";
let res = for_all_ensure(input, any!(
range!(b'A'..=b'Z'), range!(b'a'..=b'z'),
range!(b'0'..=b'9'), eq(b' ')
));
assert!(res);
}
最低支持的 Rust 版本
此 crate 的最低支持 rustc
版本是 1.61.0
测试
为了补偿大量 unsafe
,此 crate 利用严格的测试方法
- 合同设计:虽然不是形式化验证,但它比简单的属性测试更有信心。在最多出错的地方(
arch/simd_scan.rs
)每个函数都带有前缀和后缀条件,这些条件是静态验证的。 - 属性测试:为了确保此 crate 在所有支持的架构上表现一致,有一套针对它们之间细微差别的属性测试。
- 模糊测试:使用 LibFuzzer 和运行时合同断言以确保没有未定义的行为。
- 单元测试:进行基本健全性检查
贡献
我们热烈欢迎社区贡献!如果您有兴趣帮助 Swift Check 增长和改进,以下是我们在当前关注的一些领域
- 扩展测试套件:通过全面测试确保稳健性至关重要。我们希望扩大我们的测试套件,以涵盖更多边缘情况和使用场景。
- 优化回退实现:我们旨在优化回退机制,以确保 Swift Check 在 SIMD 不可用/不受支持时仍保持高效。
- 优化:一旦我们巩固了基础代码,我们计划完善我们的搜索和验证过程。
注意
这个库还处于早期阶段,它起源于一个探索性项目。我们很高兴地发现,我们的“如果”情景不仅可行,而且很有前景。目前,我们的主要重点是确保库能够正确运行,同时认识到扫描过程中存在多个优化机会。
在我们的性能评估中,我们发现使用高阶函数不会对性能产生负面影响。我们尝试了各种实现,包括创建结构体以在整个搜索过程中维护SIMD寄存器的可变参数宏。这种方法与我们的高阶实现性能相当。基于结构体的方法的主要优势在于它能够选择性地利用SIMD;例如,它使我们能够对较小的输入执行简单的搜索,而不是依赖部分SIMD加载。然而,代价是复杂性:采用这种方法可能需要转向过程宏,或者要求用户为我们声明性宏中的每个条件提供标识符。
依赖项
~235KB