首页/开发/正则与编码速查/正则引擎性能对比的测试方法
正则进阶45 条

正则引擎性能对比的测试方法

正则引擎性能对比的要点是样本与统计:必须同时覆盖成功、失败与最坏情况输入,把编译与匹配分开计时,并报告分位数与长度-耗时曲线。平均值和单轮运行会掩盖长尾,冷启动与稳态表现也要分开记录。

正则与编码速查开发更新于 2026-10-17
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌​‌​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​​‌​​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌​​​​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​​‌​​‌‌​‌​‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

引擎性能对比的测试方法

正则性能测试最容易做错的地方是样本选择:只拿正常数据跑,所有引擎看起来都很快。真正的差异出现在失败路径——长串不匹配输入、深层嵌套、构造出的最坏情况样本上。做对比前先明确要回答的问题:是某条模式在最坏输入下的耗时上界,还是整体吞吐量,两者的测法与结论完全不同。

基本信息

必测样本成功样本、失败样本、最坏情况样本(长非匹配串、深嵌套、超长单行)
必分离的变量模式编译耗时与匹配耗时;引擎通常带编译缓存,重复测量会命中缓存
推荐指标分位数(p50、p95、p99)与随输入长度变化的曲线,而不是平均值
固定项引擎与版本、编译选项、字符编码、机器负载,缺一项结论就不可比

落地步骤

  • 先写清被测问题与判定标准,例如「万行日志中单行最坏耗时不超过 5 毫秒」
  • 准备三组样本并固定下来,后续每次对比都用同一组数据,避免样本漂移掩盖变化
  • 把编译与匹配分开计时,明确是否受编译缓存影响
  • 每个用例预热后重复足够轮次,报告分位数与标准差,避免 JIT 与垃圾回收噪声
  • 画输入长度与耗时的关系曲线,判断复杂度是线性还是指数级增长
  • 记录环境信息与命令,结论要能被他人复现

基准测试写法示例

基准测试写法示例
# Python:分别测编译与匹配,重复轮次交给 timeit
python -m timeit -s "import re; p=re.compile(r'^(\\w+@\\w+\\.\\w+)$')" "p.search('a'*200 + '!')"
# shell:用 hyperfine 做多次运行并统计分布
hyperfine --warmup 3 --runs 20 'grep -cE "^[0-9]{4}-" big.log'
# 观察输入长度与耗时的关系:长度翻倍时耗时应近似翻倍,指数增长说明存在回溯爆炸
for n in 10 20 40 80; do echo -n "$n "; time_grep_with_input_of_length $n; done

常见测法与偏差

测法偏差来源修正方式
只测成功样本失败路径才是最慢路径加入必然失败的对照样本
循环内重复编译编译耗时被计入匹配先编译一次,再单独测匹配
只报平均值长尾被均值掩盖报 p95 与 p99
单轮运行预热与 JIT 影响巨大预热后再跑多轮
单机单次对比引擎版本差异被忽略记录版本并固定环境
同一引擎的不同版本往往比不同引擎之间的差距更明显:底层库换代、JIT 开关、Unicode 支持变化都会影响耗时。做引擎对比时先把版本锁死,再讨论快慢。
带有 JIT 的引擎(PCRE 的 JIT、.NET 的编译选项、JS 引擎的优化管线)首次执行明显更慢,冷启动数据不能代表稳态表现,服务端场景应分别记录冷启动与稳态两组数字。

易错点

  • 拿在线正则测试网站的耗时当结论:那通常是单次运行的浏览器环境数据,既不预热也不区分样本
  • 忽略编译缓存:引擎会缓存最近编译的模式,重复跑同一模式测出来的是缓存命中路径,掩盖真实开销
  • 只看平均值:个别超长输入造成的秒级毛刺被稀释,而这恰恰是线上真正会被投诉的现象
  • 样本只覆盖成功匹配:最坏情况出现在匹配失败路径上,缺少这类样本会得出完全错误的结论
  • 对比结论不记版本:升级底层库后结论失效,团队仍按旧数据做选型

数据来源与参考

  • Python 官方文档 timeit 模块:基准测试方法
  • hyperfine 项目文档:命令行基准测试的预热与统计
  • PCRE2 官方文档:性能与 JIT 相关说明

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/regex/regex-engine-benchmark.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌​‌​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​​‌​​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌​​​​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​​‌​​‌‌​‌​‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​