#simd #validation #search #find #no-alloc

no-std swift-check

高性能、健壮、表达性强的搜索和验证(在 x86_64、aarch64 和 WASM 上使用 SIMD)

9 个版本

0.2.1 2024 年 7 月 24 日
0.2.0 2024 年 4 月 26 日
0.1.6 2024 年 4 月 25 日

384文本处理

Download history 576/week @ 2024-04-20 53/week @ 2024-04-27 2/week @ 2024-05-04 20/week @ 2024-06-29 107/week @ 2024-07-20 34/week @ 2024-07-27

每月 157 次下载

MIT/Apache

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