实用 AWK 基准测试:gawk vs mawk vs nawk
Source: Dev.to
介绍
AWK,这门文本处理脚本语言,自 1970 年代起就伴随我们。它至今仍被广泛使用,任何 Unix 或类 Unix 系统(Linux、BSD、macOS 等)默认都提供它。它的价值延伸到现代数据流水线,在那里 AWK 可以作为一种高效的、无模式预处理器 使用。
虽然 AWK 已被 POSIX 标准化,但仍有多种不同的实现,最主要的有:
- gawk(GNU Awk):功能丰富的版本,由 Arnold Robbins 维护。是 Arch Linux、RHEL、Fedora 的默认实现。
- mawk(Mike Brennan’s Awk):面向速度的实现,使用字节码解释器,目前由 Thomas Dickey 维护。是 Debian 及其众多衍生版的默认实现。
- nawk(“唯一真正的 Awk”):语言创始人维护的原始实现,由 Brian Kernighan 维护。是 BSD 系统和 macOS 的默认实现。
在大多数 Linux 发行版中,awk 命令是指向特定实现的符号链接。你可以通过以下方式确认正在使用的变体:
ls -l $(which awk)
这次性能比较的动因是 Brian Kernighan 最近对 nawk 的更新,该更新加入了 CSV 和 UTF‑8 支持。
基准测试方法
为了评估三种 AWK 实现的性能,基准测试聚焦于两个关键指标——运行时间和峰值内存使用量——作为总体资源占用的关键组成部分。
这六个基准测试使用功能性的一行代码(one‑liners),执行与测试数据集相关的逻辑数据分析任务。它们并非依赖于合成循环或孤立指令,而是旨在体现惯用的 AWK 用法。
详细的基准测试方法、测试环境以及原始性能数据可在 Awklab.com 查看。
结果与讨论
结果基于归一化指标:
- RT – 归一化的平均运行时间。相对于最快实现的执行时间(基准为 1.0)。
- PM – 归一化的平均峰值内存。相对于内存占用最小的实现的峰值内存(基准为 1.0)。
为了在多个基准测试中提供具有代表性的比较,对归一化的 RT 和 PM 值计算了几何平均值,确保相对改进在所有测试中得到一致加权。
评估指标
要将这些归一化结果综合为一个可操作的单一分数,使用了两种评估指标:
- 欧几里得距离 (d) – 衡量从“理想点”(1, 1) 的几何距离。d 越小,表示实现越平衡,且在速度和内存两方面同时接近最佳。
- 资源占用 (F) – 计算方式为
RT × PM。它代表总体资源占用;数值越低,表示在完成相同任务时系统资源使用更高效。
摘要表
以下表格总结了基于所有归一化基准的几何均值的三种 AWK 引擎的整体性能:
| 实现 | RT | PM | d | F |
|---|---|---|---|---|
| gawk | 1.80 | 1.96 | 1.25 | 3.51 |
| mawk | 1.00 | 1.31 | 0.31 | 1.31 |
| nawk | 2.13 | 1.00 | 1.13 | 2.13 |
定义 – RT:归一化运行时间;PM:归一化峰值内存;d:欧氏距离;F:资源占用。
Discussion
对六个不同目标的基准测试结果显示,每个实现都有明确且一致的性能特征:
- mawk 始终是最快的。
- nawk 保持最低的内存占用。
- gawk 在所有基准测试中内存使用最高,但相对速度的一致性比 nawk 更好;即使排名第二或第三,它通常也能避免 nawk 出现的显著性能崩溃。
虽然 nawk 在数学逻辑和简单字段处理上很快,但在正则表达式、字符串操作以及复杂数组管理方面显著慢于其他实现。
这些单独的性能模式构成了整体指标的基础,在该指标中,速度与内存之间的权衡被正式量化。
欧氏距离 (d) 提供了一个有用的初步有效性指示,但仅依赖它可能产生误导。例如,gawk(1.25)和 nawk(1.13)的欧氏距离相对接近,但它们的资源足迹 (F) 显示出显著差异:gawk 的总资源消耗几乎高出 65 %。
这种局限性需要通过 Pareto 前沿 进行更为稳健的分析。
可视化
为了可视化权衡,归一化值被绘制在二维坐标系中,其中 x 轴代表归一化运行时间 (RT),y 轴代表归一化峰值内存 (PM)。理想点 位于 (1, 1),表示实现同时是最快且最省内存的。
图:AWK 实现的 Pareto 前沿
可视化执行速度与内存占用之间的最佳平衡
Pareto 前沿代表 非支配 解的边界——在这些实现中,无法在不牺牲另一项指标(如内存)的情况下提升某一指标(如速度)。在本研究中,mawk 和 nawk 定义了该前沿:
- mawk – 原始速度的首选。
- nawk – 最小占用的首选。
然而 gawk 位于该边界之外;因为它比 mawk 更慢且比 nawk 占用更多内存,故被视为 被支配,在原始资源效率方面是次优的。
Source: …
结论
数据表明,“最佳” AWK 实现是吞吐量与资源开销之间的精心权衡。遵循 Unix 选择合适工具的哲学,每种引擎都有其独特的运行特性。
- mawk – 高容量数据处理的强力引擎。虽然它不原生支持 CSV 或 UTF‑8,但其字节码引擎在执行速度是主要瓶颈时无可匹敌。它始终位于帕累托前沿的领先位置,提供最高的性能‑资源比。
- nawk – 适用于极简环境的首选。它在简洁性上优先于重量级正则或字符串操作,内存占用极小且可预测。对于内存开销严格受限的系统,它是决定性的选择。
- gawk – 提供更为细致的价值主张。虽然在数学上被竞争对手超越,但额外的开销换来了更广泛的功能集,这往往可以抵消其更高的资源消耗。
在各种工作流中——从数据科学流水线到系统自动化——mawk 为大多数标准任务提供了最高的性能回报。归根结底,这些结果表明,引擎的选择应当是经过深思熟虑的决定:
- 需要速度时使用 mawk。
- 需要轻量占用时使用 nawk。
- 需要其扩展工具集时使用 gawk。
