浅谈 js 正则字面量 与 new RegExp 执行效率
前几天谈了正则匹配 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 执行效率相关推荐
- php字面量,浅谈js之字面量、对象字面量的访问、关键字in的用法
一:字面量含义 字面量表示如何表达这个值,一般除去表达式,给变量赋值时,等号右边都可以认为是字面量. 字面量分为字符串字面量(string literal ).数组字面量(array literal) ...
- 浅谈 js 数字格式类型
原文:浅谈 js 数字格式类型 很多人也许只知道 123,123.456,0xff 之类的数字格式. 其实 js 格式还有很多数字格式类型,比如 1., .1 这样的,也有 .1e2 这样的. 可能有 ...
- 浅谈JS中常见的问题(三)
往期文章目录 浅谈JS中常见的问题(一) 浅谈JS中常见的问题(二) JS知识总结 往期文章目录 前言 11. 同步和异步的区别 12. JS 判断变量类型的几种方法 13. 如何阻止事件冒泡与默认事 ...
- 浅谈js函数三种定义方式 四种调用方式 调用顺序
在Javascript定义一个函数一般有如下三种方式: 函数关键字(function)语句: function fnMethodName(x){alert(x);} 函数字面量(Function Li ...
- js对象字面量属性间相互访问的问题 和 这个问题与执行环境的关系
对象字面量属性间无法相互访问的问题: 我曾经在定义一个对象时, 并出于复用性的考虑试图复用某些属性: // test 1 var person = {firstName : "Bill&qu ...
- 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十五 ║ Vue前篇:JS对象字面量this
缘起 书接上文<从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十四 ║ VUE 计划书 & 我的前后端开发简史>,昨天咱们说到了以我的经历说明的web开发经历的 ...
- 浅谈js原型和原型链
一.简述 对于javascript 对象(函数) 原型和原型链的理解,其实不那么难,简单来说,需要理解什么是原型,怎么访问原型,什么是原型链,怎么通过原型链去访问原型,就可以大概理清楚原型和原型链的基 ...
- 浅谈js执行的AO/VO
浅谈AO/VO详解 首先说明一下AO和VO的含义 AO:Activive Object,即函数的活动对象. VO:Variable Object,即变量对象. 它们的作用是帮助js引擎在引用变量的时候 ...
- js架构设计模式——由项目浅谈JS中MVVM模式
1. 背景 最近项目原因使用了durandal.js和knockout.js,颇有受益.决定写一个比较浅显的总结. 之前一直在用SpringMVC框架写后台,前台是用JSP+JS+标签库,算是很 ...
最新文章
- UINavigationController技巧一——修改返回按钮的标题
- RabbitMQ配置环境变量后启动不了的解决方法
- 多线程java_Java多线程基础
- 通信原理速识1:绪论
- 程序编码应保持良好的规范(C#)
- 华为云PB级数据库GaussDB(for Redis)介绍第四期:高斯 Geo的介绍与应用
- php计算器如何保留输入数字,php如何实现计算器代码
- 群晖nas服务器的虚拟机,黑群晖NAS 6.1.6 虚拟机VMWARE傻瓜教程
- c语言课程设计管理系统的设计,c语言课程设计-学生管理信息系统设计.doc
- Python控制仪器【2 ,控制矢量网络分析仪】
- 08矩阵加法httpwww.noi.openjudge.cn
- xp计算机启动检测硬盘,取消WinXP开机自检技巧五则
- 科学计算机度计算,科学计算器arctan
- 微信公众号上传素材并回复关键词推送该素材:thinphp开发微信公众号如何上传临时素材库
- GAEfan qiang教程
- sqlserver查看历史死锁信息
- 突破NVIDIA NVENC并发Session数目限制
- TIA博途_序列化指令Serialize的具体使用方法示例
- Cesium加载GeoJson数据(shp转化的json数据)
- 怎么搭建可视化BI数据平台(下)
热门文章
- Quick, Draw! Kaggle挑战赛丨现在,轮到你来猜了
- 能行走如飞,会自己折叠:这个哈佛实验室有一群神奇的机器人
- 苹果智能音箱HomePod跳票了,上市日期推迟到明年
- Mac系统下安装webpack,cnpm,vue-cli
- 【2018.06.21学习笔记】【linux高级知识 14.1-14.3】
- Centos 中如何快速定制二进制的内核 RPM 包
- shell 命令进阶(三)
- jquery各类资源整理
- 最新LAMP源码搭建网站平台PHP5.5.1 + Apache2.4.6 + mysql5.6.12
- 学习用TypeScript写React组件