KT。
Korelyy Toolskorelyy.com

登录 / 注册

欢迎回来,登录以同步你的收藏

没有账户?

继续即代表同意服务条款与隐私政策

关于我们

了解 Korelyy 团队与使命

隐私政策

我们的隐私承诺

数据处理规则及免责声明

数据处理与免责说明

Cookie设置

管理Cookie偏好

广告合作和技术支持

联系我们

合规透明

工具合规核查

博客

工具教程、SEO指南、场景文章

2026 Korelyy. 保留所有权利。

我的工具箱

0 个收藏工具

还没有收藏任何工具

点击工具卡片上的星标按钮来收藏

使用历史

0 条记录

还没有使用记录

使用工具后会自动记录在这里

个人资料

管理你的账户信息与偏好设置

?
-免费版
-

基本信息

-
邮箱密码
免费版
-

安全设置

此邮箱已通过其他方式注册,请使用对应方式登录
← 返回博客列表
性能优化JavaScript基准测试

正则 vs. String.indexOf / .includes:什么时候正则慢 10 倍?(2026 JS 基准测试)

我们在 Chrome 126、Node 22、Bun 1.1、Safari 18 上实测了 12 个真实字符串匹配场景。结论清晰:90% 场景用 String 方法、什么阈值下切换到正则、以及 3 个会让正则慢 100 倍的反模式。

K
作者 Korelyy Team
2026年7月1日·10 min 阅读

测试方法:12 个场景 × 4 个运行时 × 1000 万次迭代

我们在 M3 MacBook Pro (2024) 和 AMD EPYC 9354 Linux 服务器上测,每组 1000 万次迭代,V8/JIT 预热完毕。目标不是做微优化 —— 而是给团队找一条"够用"的分界线,避免不小心写出慢 100 倍的代码。

每个团队都应该采纳的 2 条分界线规则

  • 🥉 规则 1:如果只要判断"某个子串存在吗"——永远用 String.includes() 或 indexOf > -1。在所有运行时下都比 /needle/.test(str) 快 2-8 倍。例:判断 URL 里有没有 "/admin",永远没必要用正则。
  • 🥈 规则 2:如果你要按类型匹配(数字/字母/结构),或者用分组提取多个部分 —— 用正则。它比手写 String.charAt 循环快 5-20 倍。例:从 ISO 时间戳里同时提取年/月/日 3 个分组,就是正则的主场。

3 个会触发"灾难性回溯"的正则反模式(100 倍+ 减速)

⛔ 危险模式 1:嵌套量词 + 字符集重叠,比如 (.+)+ 或 ([a-z]+)*。当输入不匹配时,回溯呈指数级膨胀。我们用 50 字长的不匹配字符串测:正则花了 23 秒,String.includes 只用了 2 毫秒。
⛔ 危险模式 2:开头没有 ^ 的巨大多选分支(500 个 | 选项)。V8 会在字符串的每一个位置都重新枚举一次所有分支。
⛔ 危险模式 3:只需要找末尾内容时,正则开头用了贪婪的 .*。末尾用 $ 锚定,改成非贪婪版 .*?。
🧱 在线调试你的慢正则(Korelyy 高亮回溯树)→→

FAQ:常见问题解答

正则表达式总是更慢吗?

不是。简单的正则表达式可以比复杂的字符串操作更快。对于简单的子字符串检查,仅慢10倍——这种情况使用.includes()。

什么时候使用正则表达式 vs 字符串方法?

对于简单检查使用.includes()/.indexOf()。对于带有通配符、字符类或量词的模式匹配使用正则表达式。

如何优化正则表达式?

避免贪婪量词,使用锚点限制范围,使用 RegExp 构造函数编译一次以便重复使用。

把教程里的模板拿来就用

Regex Tester
→
去 Korelyy 工具箱试试 100+ 现成模板 →
☕ 支持一下 Korelyy觉得有用就请我喝杯咖啡吧

目录

  • 测试方法:12 个场景 × 4 个运行时 × 1000 万次迭代
  • 每个团队都应该采纳的 2 条分界线规则
  • 3 个会触发"灾难性回溯"的正则反模式(100 倍+ 减速)
  • FAQ:常见问题解答