2 个版本
0.3.3 | 2024 年 5 月 31 日 |
---|---|
0.3.2 | 2024 年 5 月 30 日 |
#2248 在 命令行工具
被 tac-k 使用
23KB
263 行
Tack
Tack 是 tac crate 的一个分支。它可以作为独立的二进制文件 tac-k 和库 tac-k-lib 使用。
Tack 是一个高性能、SIMD 加速、跨平台的 GNU Coreutils 中的 tac 工具 重写版本,许可协议为 MIT/Apache-2.0。 tac
从文件(或从 stdin
,但 见下文)读取输入,然后按行反向打印。
此 tac
实现使用 SIMD 指令集(AVX2、NEON)以加速新行的检测,并在所有支持的操作系统上利用内存映射文件。此外,它用 Rust 编写,以确保最大程度的完整性和安全性。
谁还需要一个更快的 tac
呢?
这是个好问题。尝试按逆时间顺序搜索一个多吉字节大小的网站访问日志文件(tac --line-buffered access.log | grep foo),然后告诉我。
用法
Usage: tac [OPTIONS] [FILE]...
Arguments:
[FILE]... Files to be reversed.
Read from stdin if it is `-` or not specified.
Options:
-s, --separator <BYTE> Use BYTE as the separator instead of newline.
Only single-byte character is supported.
--line-buffered Always flush output after each line
-h, --help Print help
-V, --version Print version
Tack 从任何组合的 stdin
和/或零个或多个文件中读取行,并将行按逆序写入输出。
示例
$ echo -e "hello\nworld" | tac
world
hello
$ echo -e "hello\nworld" | tac --separator=o
rld
wohello%
安装
可以通过 cargo,Rust 包管理器来构建和安装 tack 二进制文件
cargo install tac-k --locked
或通过预构建的二进制文件使用 cargo-binstall
安装
cargo binstall tac-k --locked
可以通过以下方式将 tack 库添加到您的项目中
cargo add tac-k-lib
实现说明
此 tac
实现使用 SIMD 指令集(AVX2、NEON)以加速新行的检测,如果可用。此外,使用内存映射文件通过避免因启用推测执行缓解而导致的读取输入时的上下文切换而导致的性能下降来提升性能。与随 GNU Coreutils 一起发布的 tac
版本相比,它显著(如果禁用缓解则为 2.55 倍,否则更多)更快,并且许可协议更宽松。
为了获得最佳性能
- 请尽量不要将输入管道传递给
tac
。例如,不要运行cat /usr/share/dict/words | tac
,而是直接运行tac /usr/share/dict/words
。因为根据定义,tac
必须到达文件末尾才能反向输出其输入,如果您使用tac
的stdin
接口(例如cat foo | tac
),它必须在开始处理结果之前缓冲所有stdin
输入。tac
将尝试在内存中缓冲,但一旦超过某个高水位线(目前为 4 MiB),它将切换到基于磁盘的缓冲(因为它无法知道输入的大小或它是否会超过可用的空闲内存)。 - 尽可能将
tac
放在管道的 开始。即使您可以保证tac
的输入不会超过内存缓冲限制(见上文),tac
仍然几乎肯定比您管道中的任何其他命令都要快,如果您打算反向输出,您将从开始反向输出中获得最大的好处,除非您总是要运行到命令完成。例如,不要运行grep foo /var/log/nginx/access.log | tac
,而是运行tac /var/log/nginx/access.log | grep foo
。这将(显著)减少报告前 n 个匹配项所需的时间和/或工作量(因为文件首先被快速反向,然后按所需顺序搜索,而不是慢慢搜索整个文件,然后再反向结果)。 - 如果
tac
是将输出管道传递给另一个命令而不是直接写入 tty,请使用行缓冲输出模式(tac -l -line-buffered
)。这为您提供“实时”结果流,并允许您在仅查找前 n 个匹配项时更快地终止。例如,tac -l -line-buffered access.log | grep foo
将比tac access.log | grep foo
更快地打印其第一个匹配项。 - 同样,如果您正在链式连接 n 个实用工具的输出,请确保前 n - 1 个命令都使用行缓冲模式,除非您不关心延迟而只关心吞吐量。例如,要打印某些 grep 模式的第一个两个匹配项:
tac -l -line-buffered access.log | grep -l -line-buffered foo | head -n2
。
许可证
Tack
既可以使用 MIT 许可证,也可以使用 Apache-2.0 许可证,您可以选择。
除非您明确说明,否则根据 Apache-2.0 许可证定义的,您有意提交以包含在本软件包中的任何贡献,都将按上述方式双重许可,不附加任何额外的条款或条件。
贡献
作为一个开源项目,如果没有来自各个贡献者的不懈努力,Tack 将无法存在 - 请参阅 CONTRIBUTORS.md 以获取详细信息。
依赖关系
~165KB