8 个版本 (2 个稳定版)
2.1.0 | 2024年1月22日 |
---|---|
2.0.0 | 2022年8月13日 |
0.2.3 | 2017年8月17日 |
0.1.1 | 2017年8月15日 |
#94 在 命令行工具 中
25KB
333 行
tac
tac
是 Coreutils 中的 GNU tac
工具 的高性能、SIMD 加速、跨平台重写版本,在兼容 BSD 的 (MIT) 许可证下发布。 tac
从文件(或从 stdin
,但 见下文)读取输入,然后逐行反向打印。
此 tac
实现使用 SIMD 加速进行新行检测(了解更多信息 在此),并在所有支持的操作系统上使用内存映射文件。它还用 rust 编写,以实现最大程度的完整性和安全性。
谁需要更快的 tac
呢?
好问题。尝试以倒序顺序搜索多个吉字节的网络访问日志文件(tac --line-buffered access.log | grep foo
),然后再回来告诉我。
用法
Usage: tac [OPTIONS] [FILE1..]
Write each FILE to standard output, last line first.
Reads from stdin if FILE is - or not specified.
Options:
-h --help Print this help text and exit
-v --version Print version and exit.
--line-buffered Always flush output after each line.
tac
从 stdin
和/或零个或多个文件中读取行,并将行按逆序写入输出。
示例
$ echo -e "hello\nworld" | tac
world
hello
安装
tac
可以通过 cargo(Rust 包管理器)安装
cargo install tac
恳请协助将 tac
添加到各个平台的包管理器。这真是一个耗时的工作,尤其是对于那些偶尔才与各种打包工具交互的人,而不是每天都要这样做。
目前 arm64 (aarch64) NEON 加速仅在夜间编译器中可用。如果使用它,请向 cargo
提供 --features nightly
标志以启用支持。
实现说明
此版本的 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 -buffered
)。这为您提供“实时”流式传输结果,并让您在只需要查找前 n 个匹配的情况下更快地终止。例如,tac -l -buffered access.log | grep foo
将比tac access.log | grep foo
更快地打印出其第一个匹配项。 - 同样地,如果你正在链式调用 n 个工具的输出,请确保所有直到 n - 1 的命令都在使用行缓冲模式,除非你不关心延迟,只关心吞吐量。例如,要打印某个 grep 模式的第一个两个匹配项:
tac - -line-buffered access..log | grep - -line-buffered foo | head -n2
。
许可和版权
tac
以 MIT 公共许可证条款发布。版权所有 Mahmoud Al-Qudsi 2017-2021。未由 MIT 许可证授予的所有权利均予保留。
作为一个开源项目,没有众多贡献者的不懈努力,tac
将无法存在——请参阅 CONTRIBUTORS.md 获取详细信息。
依赖关系
~58–275KB