前几天谈了正则匹配 js 字符串的问题:《js 正则学习小记之匹配字符串》 和 《js 正则学习小记之匹配字符串优化篇》。
里面讲到了优化正则起到提升性能的问题,但是能提升多少呢?
于是我去测试了,发现TMD几乎微乎其微,我用1千字符串进行100万次匹配测试,优不优化根本没区别。

这不科学,我白看了这么多天正则,上天这是在玩弄我么。

突然我想到了 compile 方法,然后去测试了下,奇迹出现了,果然优化过的快了不少。

但这是为什么呢?
于是我翻阅资料,在 MDN 上找到了 RegExp Methods
这里说 compile 方法已被弃用!这不科学。。。
在 stackoverflow 上发现这篇文章 Javascript: what's the point of RegExp.compile()? 
文章大意是说其实 直接 new RegExp 即可,compile 几乎用不到。
于是乎我修改了代码再来一次。

果然,直接 new RegExp 效果和 compile 是一样的。
不过这只是 nodejs 下的结果,我们去看看各个浏览器下的结果如何吧。

<!doctype html>
<html lang="en"><head><meta charset="UTF-8"><title>test</title>
</head><body><script>var str1 = '"' + Array(100).join("x") + '123456\\\'78\\\"90"';var str2 = '"' + Array(100).join("x") + 'ooo\\\\oooo\\\nxxxx\\\"xxxx"';// 这里写100,小一点,防止等半天,FF那怂货就半天console.log("字符串1:", str1);console.log("字符串2:", str2);var reg1 = /"(?:\\.|[^"])*"/;var reg2 = /"(?:[^"\\]|\\[\d\D])*"/;var reg11 = new RegExp('"(?:\\.|[^"])*"');var reg22 = new RegExp('"(?:[^"\\]|\\[\d\D])*"');var n = 1e6; //100万次测试test("reg1", reg1);test("reg2", reg2);test("reg11", reg11);test("reg22", reg22);function test(name, re) {console.time(name);for (var i = 0; i < n; i++) {str1.match(re);str2.match(re);}console.timeEnd(name);}</script>
</body></html>


chrome


firefox


IE11


IE8 (我调用了一个插件模拟控制台实现IE6-8调试输出的)

很明显,第一名是 chrome (以 reg22 那个优化过的为准),这个号称武装到牙齿的货,果然够new逼。
不过 firefox 这货,竟然连 IE8 都比不过,是不是太怂了点。

优化过的 正则 比没优化的快,那是肯定的。
但是 正则字面量 和 new RegExp 比,那就不是一个档次了。
为什么有如此大的差距呢?
其实我也没搞清楚。

以前看到很多文章都说 字面量 会比 new 对象 形式效率高,但是在正则这里,好像不是这么回事。
不过也不能直接否认这个观点,因为我一直都用字面量的,简洁美观,用着方便才是王道。

我觉得在数据量大,或者重复操作次数多的时候用 new RegExp 是很必要的。
因为你也看到了性能提升这么多。
当然前提条件是你的正则必须优化,正则没优化的情况,两种差不多。
所以优化你的正则,然后用 new RegExp 可以大幅度提升程序的性能。

PS: IE11 是个特例,这货从来不安套路出牌。

好了今天的分享完毕,你们都蠢蠢欲动了吧,快去把正则各种new起来吧。

浅谈 js 正则字面量 与 new RegExp 执行效率相关推荐

  1. php字面量,浅谈js之字面量、对象字面量的访问、关键字in的用法

    一:字面量含义 字面量表示如何表达这个值,一般除去表达式,给变量赋值时,等号右边都可以认为是字面量. 字面量分为字符串字面量(string literal ).数组字面量(array literal) ...

  2. 浅谈 js 数字格式类型

    原文:浅谈 js 数字格式类型 很多人也许只知道 123,123.456,0xff 之类的数字格式. 其实 js 格式还有很多数字格式类型,比如 1., .1 这样的,也有 .1e2 这样的. 可能有 ...

  3. 浅谈JS中常见的问题(三)

    往期文章目录 浅谈JS中常见的问题(一) 浅谈JS中常见的问题(二) JS知识总结 往期文章目录 前言 11. 同步和异步的区别 12. JS 判断变量类型的几种方法 13. 如何阻止事件冒泡与默认事 ...

  4. 浅谈js函数三种定义方式 四种调用方式 调用顺序

    在Javascript定义一个函数一般有如下三种方式: 函数关键字(function)语句: function fnMethodName(x){alert(x);} 函数字面量(Function Li ...

  5. js对象字面量属性间相互访问的问题 和 这个问题与执行环境的关系

    对象字面量属性间无法相互访问的问题: 我曾经在定义一个对象时, 并出于复用性的考虑试图复用某些属性: // test 1 var person = {firstName : "Bill&qu ...

  6. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十五 ║ Vue前篇:JS对象字面量this

    缘起 书接上文<从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十四 ║ VUE 计划书 & 我的前后端开发简史>,昨天咱们说到了以我的经历说明的web开发经历的 ...

  7. 浅谈js原型和原型链

    一.简述 对于javascript 对象(函数) 原型和原型链的理解,其实不那么难,简单来说,需要理解什么是原型,怎么访问原型,什么是原型链,怎么通过原型链去访问原型,就可以大概理清楚原型和原型链的基 ...

  8. 浅谈js执行的AO/VO

    浅谈AO/VO详解 首先说明一下AO和VO的含义 AO:Activive Object,即函数的活动对象. VO:Variable Object,即变量对象. 它们的作用是帮助js引擎在引用变量的时候 ...

  9. js架构设计模式——由项目浅谈JS中MVVM模式

    1.    背景 最近项目原因使用了durandal.js和knockout.js,颇有受益.决定写一个比较浅显的总结. 之前一直在用SpringMVC框架写后台,前台是用JSP+JS+标签库,算是很 ...

最新文章

  1. UINavigationController技巧一——修改返回按钮的标题
  2. RabbitMQ配置环境变量后启动不了的解决方法
  3. 多线程java_Java多线程基础
  4. 通信原理速识1:绪论
  5. 程序编码应保持良好的规范(C#)
  6. 华为云PB级数据库GaussDB(for Redis)介绍第四期:高斯 Geo的介绍与应用
  7. php计算器如何保留输入数字,php如何实现计算器代码
  8. 群晖nas服务器的虚拟机,黑群晖NAS 6.1.6 虚拟机VMWARE傻瓜教程
  9. c语言课程设计管理系统的设计,c语言课程设计-学生管理信息系统设计.doc
  10. Python控制仪器【2 ,控制矢量网络分析仪】
  11. 08矩阵加法httpwww.noi.openjudge.cn
  12. xp计算机启动检测硬盘,取消WinXP开机自检技巧五则
  13. 科学计算机度计算,科学计算器arctan
  14. 微信公众号上传素材并回复关键词推送该素材:thinphp开发微信公众号如何上传临时素材库
  15. GAEfan qiang教程
  16. sqlserver查看历史死锁信息
  17. 突破NVIDIA NVENC并发Session数目限制
  18. TIA博途_序列化指令Serialize的具体使用方法示例
  19. Cesium加载GeoJson数据(shp转化的json数据)
  20. 怎么搭建可视化BI数据平台(下)

热门文章

  1. Quick, Draw! Kaggle挑战赛丨现在,轮到你来猜了
  2. 能行走如飞,会自己折叠:这个哈佛实验室有一群神奇的机器人
  3. 苹果智能音箱HomePod跳票了,上市日期推迟到明年
  4. Mac系统下安装webpack,cnpm,vue-cli
  5. 【2018.06.21学习笔记】【linux高级知识 14.1-14.3】
  6. Centos 中如何快速定制二进制的内核 RPM 包
  7. shell 命令进阶(三)
  8. jquery各类资源整理
  9. 最新LAMP源码搭建网站平台PHP5.5.1 + Apache2.4.6 + mysql5.6.12
  10. 学习用TypeScript写React组件