本页面概述了 ripgrep 的性能特点以及使其成为最快的 grep 类工具之一的技术。虽然基准测试涵盖了 ripgrep 的性能衡量方式,但本文档侧重于解释 ripgrep 之所以快速的原因及其实现的优化技术。
Ripgrep 在保持正确性和灵活性的同时,专注于速度。其性能源于多层优化,从算法选择到底层代码优化。基准测试持续显示 ripgrep 在大多数场景下优于同类工具。
如 README 中所示,ripgrep 通常优于 The Silver Searcher (ag)、GNU grep、ugrep、ack 和 git grep 等工具,而且通常优势显著。这些性能优势在各种搜索模式和语料库类型中都得以保持。
Ripgrep 的架构在每个层面都将性能作为关键考虑因素。
来源:README.md187-208 crates/regex/src/matcher.rs364-506
Ripgrep 的速度来自多种优化技术的协同作用
ripgrep 性能的基础是 Rust 的 regex crate,它提供了
来源:README.md189-197 crates/regex/src/matcher.rs9-16
Ripgrep 增强了 Regex 引擎的功能,并进行了额外的字面量提取
此优化从复杂模式中提取字面量字符串,并创建一个更简单的 Regex 来快速识别潜在匹配项。例如,对于类似 \w+foo\w+ 的模式,ripgrep 可以提取 foo,并用它在应用完整 Regex 模式之前查找候选行。
来源:crates/regex/src/literal.rs12-40 crates/regex/src/matcher.rs72-78
Ripgrep 根据上下文选择最佳的文件读取策略
这种自动选择有助于在不同工作负载下保持高性能。
Ripgrep 分析模式以识别永不会出现在匹配中的字节
这允许在调用昂贵的 Regex 引擎之前,快速拒绝不可能匹配的文本区域。
来源:crates/regex/src/non_matching.rs9-81 crates/regex/src/matcher.rs480-486
搜索目录时,ripgrep 使用并行处理
crossbeam 和 ignore crate)Ripgrep 高效处理 .gitignore 和其他忽略模式
RegexSet 同时匹配文件路径和多个模式ripgrep 中的完整搜索过程结合了这些优化
这种多层方法确保 ripgrep 能够快速搜索各种类型的文件和目录结构,同时保持准确性。
来源:crates/regex/src/matcher.rs408-506 crates/regex/src/literal.rs44-124
Ripgrep 的性能因搜索类型而异
| 工作负载 | 性能特征 | 备注 |
|---|---|---|
| 简单的字面量搜索 | 极快 | 利用 SIMD 优化 |
| 带字面量的正则表达式 | 非常快 | 使用内部字面量提取 |
| 复杂的正则表达式 | 快 | 回退到优化的 Regex 引擎 |
| 大型单个文件 | 良好 | 高效使用内存映射 |
| 大量小文件 | 优秀 | 使用缓冲区读取进行并行处理 |
| Unicode 内容 | 良好 | 内置 UTF-8 支持,开销极小 |
用户可以通过命令行标志调整性能
| 标志 | 性能影响 |
|---|---|
--mmap / --no-mmap | 强制/禁用内存映射策略 |
-j/--threads NUM | 控制并行搜索的线程数 |
--dfa-size-limit NUM | 设置 Regex DFA 的大小限制 |
-U/--multiline | 以牺牲性能为代价,实现多行匹配功能 |
-F/--fixed-strings | 通过将模式视为字面量字符串来提高性能 |
--regex-size-limit NUM | 设置编译后的 Regex 的最大大小 |
来源:crates/regex/src/config.rs45-68 crates/regex/src/matcher.rs199-229
当 ripgrep 的性能不符合预期时,代码中包含诊断工具
来源:crates/regex/src/error.rs1-94 crates/core/messages.rs1-139
ripgrep 中的性能优化在几个关键组件中实现
广泛的基准测试套件(benchsuite)提供了与其他工具的持续性能测试,确保 ripgrep 保持其速度优势。
来源:crates/regex/src/matcher.rs14-362 crates/regex/src/literal.rs40-644 benchsuite/benchsuite1-3230
Ripgrep 做出了一些权衡以保持其速度
通过结合这些技术,ripgrep 在保持准确性和可用性的同时,实现了卓越的搜索性能。
刷新此 Wiki
最后索引时间2025 年 4 月 18 日(6dfaec)