BEHILOS 基准:低占用 CLI 搜索工具的性能分析

发布: (2026年2月12日 GMT+8 21:07)
10 分钟阅读
原文: Dev.to

Source: Dev.to

请提供您希望翻译的正文内容,我将按照要求将其译成简体中文并保留原有的格式、Markdown 语法以及技术术语。谢谢!

BEHILOS 基准测试

在他的著作 Unix: A History and a Memoir 中,Brian Kernighan 讲述了他最喜欢的早期 Unix grep 故事。贝尔实验室的某人问是否可以找到只由倒置计算器显示的字母组成的英文单词。倒置计算器显示的数字 5071438 对应的字母集合是 BEHILOS

Kernighan 用正则表达式 ^[behilos]*$ 在 Webster’s Second International Dictionary(当时包含 234 936 个单词)中进行 grep,找到了 263 个匹配——其中包括他从未见过的单词。

当前的 Webster’s Second International Dictionary 包含 236 007 个单词。要复现结果,运行:

grep ^[behilos]*$ /usr/share/dict/web2

这会得到 264 个匹配。最长的单词是九个字符长:blisslessbooboisie

起初只是一个历史脚注,却让我很快想到:如果把旧的 BEHILOS grep 用作今天搜索工具的快速粗糙基准,它的表现会怎样?

已测试工具

ToolDescription
grep经典的 Unix 工具;文本搜索的历史基准。
rg (ripgrep)现代、极其快速的递归搜索器,针对大型代码库进行优化。
gawkGNU AWK 实现;功能丰富,广泛用于文本处理。
mawk轻量、高效的 AWK 变体,内存占用极小。
nawk传统的 New AWK,保留了旧脚本的历史行为。
ag (The Silver Searcher)快速的递归搜索器,常用于取代 ack
pt (The Platinum Searcher)较新的递归 grep 替代品,支持多线程。
ack基于 Perl 的源码树搜索器,维护并针对代码模式进行优化。
ugrep功能丰富的现代 grep 克隆,支持扩展正则表达式并进行性能调优。
sift针对大型目录的递归搜索工具,优化了开发者工作流。

基准测试方法论

  • 为了评估搜索引擎的性能,基准测试聚焦于两个关键指标:运行时间(runtime)和峰值内存使用(peak memory usage),它们共同代表了总体资源占用。
  • 资源跟踪使用 cgmemtime 完成,它是捕获进程组峰值内存消耗的理想工具。
  • 基准测试过程通过 benchgab.awk(版本 2026.02.10)自动化,这是一款自定义运行器,能够处理热身、多个测试运行,并计算统计指标以及用于对比分析的归一化参数。
  • 每个基准序列包括 一次初始热身运行,随后 100 次记录运行
  • 完整的方法论、测试环境、原始数据、统计分析和归一化性能指标已在 Awklab.com 上发布。

归一化指标

符号含义
RT归一化中位运行时间 – 相对于最快实现的执行时间(基准 = 1.0)。
PM归一化中位组峰值内存 – 相对于内存占用最低实现的峰值内存(基准 = 1.0)。
F资源足迹 – 计算方式为 RT × PM。数值越低表示在完成相同任务时系统资源使用越高效。

这些归一化的 BEHILOS 基准通过 Pareto 前沿分析(与我之前的 AWK 基准研究相同)进行评估。为了可视化搜索引擎的性能,归一化数值被绘制在二维坐标系上:

  • x 轴: 归一化运行时间(RT)
  • y 轴: 归一化峰值内存使用(PM)

理想点位于 (1, 1),代表实现同时是最快且最省内存的。为提升聚集在理想点附近的实现的可见度,采用了对数尺度。

图表: 在 BEHILOS 基准测试中测试的搜索工具的 Pareto 前沿,展示了执行速度与内存占用之间的最佳权衡。

Source:

结果概览

归一化的 BEHILOS 结果在同时考虑运行时间和峰值内存使用时,能够清晰地将被测工具划分为不同的性能层级。

综合冠军

  • grep 是 BEHILOS 基准测试的综合冠军。
    • 最快的实现 (RT = 1.00)
    • 接近最小内存基准 (PM = 1.18)
    • 最小资源占用 (F = 1.18)

grepmawk 构成了帕累托前沿。

帕累托前沿

工具RTPMF
grep1.001.181.18
mawk1.831.001.83
  • grep 运行最快,同时保持在接近最小内存基准的水平。
  • mawk 取得了最低的峰值内存使用,仅以适度的运行时间为代价。两者都无法在不牺牲另一维度的情况下进一步提升,因而位于帕累托前沿,代表了该工作负载的最佳折衷范围。

接近前沿的工具

工具RTPMF
rg1.121.311.47
ugrep1.201.381.66
ag1.451.552.25
gawk1.581.622.56

这些工具虽被前沿支配,但仍与其相对接近。它们的归一化距离和 F 值表明,它们并非此特定任务的最优选择,但性能特性仍具竞争力。这反映了它们在功能更丰富、文件处理更广或面向更通用工作负载方面的设计取舍,而非追求最小占用。

异常值

工具RTPMF
pt2.302.104.83
sift3.102.457.60
ack4.202.8011.76
nawk8.001.3610.88

这些工具远离帕累托前沿。它们的高归一化运行时间和峰值内存使用导致 F 值非常大,表明在此高度限定的基准中效率极低。相对于 BEHILOS 搜索的简洁性,它们产生了显著的开销。

nawk 细节

尽管 nawk 显示出较低的峰值内存占用 (PM = 1.36),其慢速运行时间 (RT = 8.00) 使其远离高效区。此外,它在所有测试工具中表现出最高的峰值内存抖动,这进一步削弱了整体性能。

要点

BEHILOS 基准展示了,尽管现代功能丰富的搜索工具层出不穷,经典的 Unix grep 仍然是进行仅字符类搜索时最高效的解决方案。它兼具速度快、内存占用适中的优势,拥有最低的整体资源占用,重新 affirm(确认)了精心设计、专注工具的永恒价值。

结论

Pareto 分析凸显了为极简主义和可预测性而优化的工具在本基准中占据主导,而功能更为繁杂的搜索器在运行时间和内存方面都付出了可观的代价。

BEHILOS grep,虽然起源于 Unix 早期的一个历史轶事,却意外成为了一个有效的微基准。它的简洁性将正则表达式匹配、进程启动和内存分配的核心成本隔离出来,避免了文件系统遍历或复杂 I/O 模式等混杂因素的干扰。

该基准表明,对于低占用的文本搜索,数十年前的设计原则仍然重要。像 grep 这样的经典 Unix 工具,以及 mawk 等轻量实现,在效率是首要目标时仍难以被超越。现代搜索引擎在真实工作负载下提供强大功能和出色性能,但这些优势并非免费获得。

BEHILOS 基准 旨在加冕某个“最佳”搜索工具。相反,它展示了通过一个最小且精挑细选的工作负载,如何揭示速度、内存使用和稳定性之间的基本权衡——以及为何即使是一个小小的历史脚注,今天仍能为我们提供关于性能的有意义的启示。

0 浏览
Back to Blog

相关文章

阅读更多 »