#fuzzy #selector #text #utf-8 #fzy #terminal

bin+lib rff

rff 是一个快速、简单的终端模糊文本选择器

1 个不稳定版本

使用旧的 Rust 2015

0.3.0 2018年4月2日

#34#selector


用于 riiry

MIT 许可证

45KB
1K SLoC

rff

rff 是一个快速、简单的终端模糊文本选择器,具有完整的 UTF-8 支持。它使用了 fzy 的高级评分算法

安装

预编译的二进制文件 从版本 0.3.0 开始可用。

如果您已安装 Rust 工具链,您还可以通过 Cargo 从源代码构建 rff

$ cargo install --git https://github.com/stewart/rff

此外,您还可以告诉 rustc 为您的特定 CPU 架构构建,以获得可能的轻微速度提升

$ RUSTFLAGS="-C target-cpu=native" cargo install --git https://github.com/stewart/rff

使用方法

rff 可以作为其他模糊查找器(如 fzyselecta)的替代品。

有关如何使用这些工具的示例,请参阅 selecta 的示例

基准测试

两者 fzyrff 都有一个 --benchmark 模式,它会运行 100 次匹配/评分循环,而不打印任何内容。这有助于最小化启动成本和 I/O 的影响,并更好地展示实际的匹配/评分速度。

为了确保有足够大的语料库,以便可以执行多线程优化,这些测试是在针对 Linux 内核源代码树中的文件列表运行的。

结果表明,总的来说,在 Linux 上,rff 比较慢,但在 macOS 上明显更快。然而,在实际使用中,这两个工具对于大多数项目来说都足够快了。毕竟,我们在任意基准模式下测试的是整个 Linux 内核!

权衡是,rff 支持输入和搜索词中的 UTF-8 字符,而 fzy 专注于 ASCII,尽管有计划最终支持宽字符。

使用了 hyperfine 工具来生成这些结果。

这个基准测试是在一个全新的 20 核 Linode 实例上运行的,该实例运行的是 Ubuntu 16.04 LTS

$ find ~/dev/linux -type f > files

$ hyperfine --warmup 5 'fzy -e drivers --benchmark < files' 'rff -s drivers --benchmark < files'
Benchmark #1: fzy -e drivers --benchmark < files

  Time (mean ± σ):     423.9 ms ±   7.8 ms

  Range (min … max):   407.7 ms … 432.9 ms

Benchmark #2: rff -s drivers --benchmark < files

  Time (mean ± σ):     529.7 ms ±   7.2 ms

  Range (min … max):   512.2 ms … 536.4 ms

有趣的是,tolower 的 macOS 实现似乎没有很好地优化,导致 fzy 的评分速度大大减慢。

λ find ~/dev/linux -type f > files

$ hyperfine --warmup 5 'fzy -e drivers --benchmark < files' 'rff -s drivers --benchmark < files'
Benchmark #1: fzy -e drivers --benchmark < files

  Time (mean ± σ):     1.764 s ± 0.337 s

  Range (min … max):   1.653 s … 2.722 s

Benchmark #2: rff -s drivers --benchmark < files

  Time (mean ± σ):     1.019 s ± 0.004 s

  Range (min … max):   1.015 s … 1.027 s

如果您有任何关于如何使 rff 更加快速的想法,请与我联系并告知!这是我不太熟悉的编程领域,构建这个工具是一个有趣的 learning experience!

依赖项

~2MB
~33K SLoC