Skip to content

Latest commit

 

History

History
125 lines (86 loc) · 4.59 KB

File metadata and controls

125 lines (86 loc) · 4.59 KB

Rust x Regex (Regular Expression)

Rust 官方有 Regex Engine 的實做, 設計上是類似 Google 的 RE2 而不是 PCRE, 也就是採用 Finite Automata 的設計而不是使用 Backtracking 來實做, 藉此來提供線性的時間複雜度。 Rust 的 regex 實做還參考了 Intel 的 Hyperscan 引入部份 SIMD 加速。 實際應用上也在 ripgrep 中展現了一定程度的優勢。

在 Computer Language Benchmarks Game 的 regex-redux 項目中也展現不錯的速度。

在支援 Lookaround 和 Backtracking 功能方面, 另外有 fancy-regex 嘗試混合不同實做, 當使用的正規表達不包含 Lookaround 和 Backtracking 需求時, 就採用 DFA/NFA 實做, 否則採用 Backtracking 實做。 ( syntect 有支援使用 fancy-regex 作爲引擎, 在測試資料內,行爲上跟 Oniguruma 相同,但是效能大約只有一半,還有待進一步改善)

使用 NFA 實作的好處是可以控制最差的狀況, 但是壞處是不能支援特定的操作(如 Lookaround 和 Backtracking)。 使用 Backtracking 實作的好處是可以支援更豐富的操作, 壞處是不能控制最差的狀況, 如果提供給使用者的話, 有可能成爲 DoS 攻擊點。

  • Rust regex 的效能測試紀錄
    • 用 cargo-benchcmp 可以進行比對,除了少部份較 RE2 慢外,Rust regex 在大部分測項中都有大幅的效能提升

Aho-Corasick 是一個搜尋子字串的演算法, 可以一次搜尋多個子字串, 搜尋複雜度為 O(n + p + m)n 為字串長度, p 為要搜尋的子字串的總共長度, m 為匹配到的次數。

Teddy 是利用 SIMD 優化過的子字串搜尋演算法, 源自於 Intel 的 Hyperscan 專案, 可以提供執行效能更加的方案。