前几日谈了正则配对 js 字符串的难题:《js 正则学习小记之匹配字符串》 和 《js 正则学习小记之匹配字符串优化篇》。
里边讲来到优化正则具有提高特性的难题,可是能提高是多少呢?
因此我要去检测了,发觉TMD基本上寥寥无几,我就用1千字符串开展一百万次配对检测,优不优化压根没差别。

浅谈js正则字面量//与new RegExp的执行效率 RegExp new 字面量 js正则 正则表达式  第1张

这不科学,我白看过那么来天正则,老天爷它是在蹂躏我么。

忽然我想起了 compile 方式 ,随后去检测了下,奇迹了,果真优化过的快了许多。

浅谈js正则字面量//与new RegExp的执行效率 RegExp new 字面量 js正则 正则表达式  第2张

但这是为什么呢?
因此我阅览材料,在 MDN 上找到 RegExp Methods
这儿说 compile 方式 已被弃用!这不科学。。。
在 stackoverflow 上发觉本文 Javascript: what's the point of RegExp.compile()? 
文章内容疏忽是说实际上 立即 new RegExp 就可以,compile 基本上用不上。
因此我改动了编码再来一次。

浅谈js正则字面量//与new RegExp的执行效率 RegExp new 字面量 js正则 正则表达式  第3张

果真,立即 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; //一百万次测试
  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>

浅谈js正则字面量//与new RegExp的执行效率 RegExp new 字面量 js正则 正则表达式  第4张
chrome

浅谈js正则字面量//与new RegExp的执行效率 RegExp new 字面量 js正则 正则表达式  第5张
firefox

浅谈js正则字面量//与new RegExp的执行效率 RegExp new 字面量 js正则 正则表达式  第6张
IE11

浅谈js正则字面量//与new RegExp的执行效率 RegExp new 字面量 js正则 正则表达式  第7张
IE8 (我启用了一个软件仿真模拟控制面板完成IE6-8调节輸出的)

很显著,第一名是 chrome (以 reg22 哪个优化过的为标准),这一称为武装到牙齿的货,果真够new逼。
但是 firefox 这货,居然连 IE8 都比但是,是否太怂了点。

优化过的 正则 比没优化的快,那就是毫无疑问的。
可是 正则字面量 和 new RegExp 比,那么就并不是一个级别了。
为什么有这般大的差别呢?
实际上因为我没弄清楚。

之前见到许多文章内容都说 字面量 会比 new 目标 方式高效率,可是在正则这儿,仿佛并不是这样。
但是也不可以立即否定这一见解,由于我一直都用字面量的,简约美观大方,用着便捷才是硬道理。

我认为在信息量大,或是反复实际操作频次多的情况下用 new RegExp 是很必需的。
由于你也看到了特性提高这么多。
自然必要条件就是你的正则务必优化,正则没优化的状况,二种类似。
因此 优化你的正则,随后用 new RegExp 能够 大幅提高程序流程的特性。

PS: IE11 是个充分必要条件,这货从不安招数打牌。

好啦今日的共享结束,大家都按耐不住了吧,快点把正则各种各样new吧。