当前位置: 首页 > news >正文

.NET 10 的正则性能现在什么水平?我拿它和 Go、Python、C++、PCRE2 测了一轮

所以我没有试图“复现原文结果”。原文数据不公开,就没法严肃复现。我这里做的是另一件事:用公开、确定性的规则合成一份数据,然后把所有代码放出来,让别人可以重新跑。

数据生成脚本在仓库里,规则很简单:

  • 生成约 1GB 的文本文件
  • 每行是一个 JSON string literal
  • JSON string 里面再放一个紧凑 JSON object
  • 每 20 行放一条TSLA,也就是大约 5% 命中
  • 固定随机种子,确保别人生成出来的数据一致

实际这次生成的数据是:

bytes: 1,073,741,855 lines: 4,624,532 expected matches: 231,227 pattern: \"TSLA.*?\" seed: 20260702

所有实现都先把文件读进内存,然后只统计内存中扫描匹配的时间。读取时间也记录了,但不参与排序。

测了哪些实现?

这次一共测了 10 个:

case说明
MSVCstd::regexVisual Studio 18 / MSVC STL
MinGWstd::regexGCC 16.1.0 / libstdc++
PCRE2vcpkg PCRE2 10.47
PCRE2 JIT显式pcre2_jit_match
PythonrePython 3.12.4
GoregexpGo 1.26.2
.NET Regex普通Regex,构造一次复用
.NET CompiledRegexOptions.Compiled,构造一次复用
.NET GeneratedRegexsource generator 生成的正则
.NET NonBacktrackingRegexOptions.NonBacktracking

这里有个小点要说明:普通new Regex(...)不是每行都 new 一次,而是构造一次后复用。每行都 new 那属于测错误用法,不是正常业务热路径。

.NET 这边大概是这样:

private const string Pattern = "\\\"TSLA.*?\\\""; private static readonly Regex PlainRegex = new(Pattern, RegexOptions.CultureInvariant); private static readonly Regex CompiledRegex = new(Pattern, RegexOptions.CultureInvariant | RegexOptions.Compiled); private static readonly Regex NonBacktrackingRegex = new(Pattern, RegexOptions.CultureInvariant | RegexOptions.NonBacktracking); [GeneratedRegex(Pattern, RegexOptions.CultureInvariant)] private static partial Regex InfoLineRegex();

核心循环也没什么花活:

private static long MatchLines(string[] lines, Regex regex) { long matches = 0; foreach (var line in lines) { if (regex.IsMatch(line)) { matches++; } } return matches; }

C++ 的 PCRE2 JIT 也不是“编译了 JIT 然后还调用普通 match”这种模糊写法,而是明确调用pcre2_jit_match。完整代码直接看 GitHub 就行,这里不贴一大坨了。

结果

每个 case:

  • warmup 1 次
  • 正式跑 3 次
  • 只统计扫描匹配时间
  • 所有 case 匹配数都必须等于231,227

结果如下,按平均耗时排序:

排名实现平均单轮扫描
1.NET GeneratedRegex125.566 ms
2.NET Regex170.996 ms
3.NET RegexOptions.Compiled171.583 ms
4.NET RegexOptions.NonBacktracking219.780 ms
5Go regexp303.017 ms
6MSVC std::regex448.698 ms
7PCRE2 JIT612.498 ms
8Python re894.424 ms
9PCRE25,191.270 ms
10MinGW/libstdc++ std::regex26,272.900 ms

.NETGeneratedRegex三轮分别是:

125.294 ms 125.734 ms 125.669 ms

这个波动很小,所以至少在这份数据上,不像是偶然抖出来的。

另外我一开始也跑过 1MB 的小数据,那个时候 .NET 没这么明显的优势。这个也正常,1MB 太小了,JIT、tiered compilation、缓存状态、计时噪声都能影响结果。到了 1GB 之后,差距就稳定多了。

有几个结果挺有意思

第一,.NET GeneratedRegex真的很猛。

这个结果对我来说有点爽,但不是完全意外。现在的 .NET Regex 对这类

http://www.jsqmd.com/news/1139646/

相关文章:

  • WaveTools:一键解锁《鸣潮》120FPS高帧率与画质优化完整指南
  • 北京华恒智信为酒店行业搭建三维人才分流体系化解业务用人难题
  • 跨平台视频解密工具:轻松下载微信视频号、抖音等加密资源
  • 3分钟制作USB启动盘:Rufus极速格式化工具全攻略
  • ORB-SLAM3 SearchByBoW 2
  • 写在开头:我为什么开这个专栏?
  • 今天偶然发现有一个评论有500个赞
  • 宝可梦实景图数据集在无人机导航中的计算机视觉应用
  • 终极指南:大麦网双端自动抢票技术方案与实战部署
  • TwinCAT3 3.1 配置汇川 SV660N:EtherCAT 扫描与 8388608 分辨率设置详解
  • 摩托车混流装配防错引导系统硬件怎么选?海雅达 Model 10X 工业三防平板电脑采购预算与部署成本评估
  • 成对评估上包络线:有界指标的稳健效果边界计算方法
  • Metasploit进阶:从set payload到generate命令的Shellcode生成与免杀实战
  • Linux防火墙极简配置指南:10分钟掌握firewalld核心安全策略
  • 常见硬件设计问题分析及解决方案-EMC静电问题
  • Seedance 2.5本地AI生图与视频生成:部署指南与参数调优
  • F28377D Modbus RTU移植:硬件时序、寄存器映射与实时性硬核实践
  • 从SSTI模板注入到docker容器内网渗透:靶机练习之Tempus_fugit3
  • Windows系统下Xray被动扫描环境配置全攻略:从证书安装到代理设置
  • 狼人杀不只是游戏:9 个大模型的多轮博弈能力观察
  • 2026年东莞良心4s店哪家服务好:最新权威排名与专业指南。
  • 洛雪音乐音源完全指南:如何免费获取全网无损音乐资源
  • 如何快速掌握res-downloader:全网视频音频资源下载的终极指南
  • Snipe-IT新手部署全路径指南:XAMPP/Ubuntu/Docker三路实操
  • 基于行车记录仪与AI的道路病害自动检测技术实践
  • 从“人工智障”到“智能管家”:手把手教你重构一个R语言AI智能体
  • WindowResizer:Windows窗口调整终极解决方案,告别无法调整大小的顽固窗口
  • PCB孔金属化工艺:从化学镀铜到直接电镀的2种方案与15μm厚度控制
  • Fortify路径遍历漏洞深度解析:从输入验证到数据流防护的完整方案
  • 3个月成为专业前端开发者:freeCodeCamp前端开发库认证完全指南