【问题标题】:Javascript regexp performance and cachingJavascript 正则表达式性能和缓存
【发布时间】:2015-02-17 16:50:17
【问题描述】:

我正在寻找这个question 的答案,并且我在这样的响应之间进行了一些性能测试:

console.time("first_test");
for( i=0;i<10000;i++)
    result=function1(str);
console.log(result);
console.timeEnd("first_test");


console.time("second_test");
for( i=0;i<10000;i++)
    result=function2(str);
console.log(result);
console.timeEnd("second_test");

this gives: 
first_test: 232ms
second_test: 21ms

And if I reverse the order of the tests: 
second_test: 128ms
first_test: 102ms

函数和正则表达式几乎相同,但即使我更改了传入参数的字符串,第二个函数的执行速度总是比第一个函数快。

所以我一开始想知道第一个函数如何加快第二个函数的速度,以及更笼统地说正则表达式是如何被缓存的。

function function1(str){

  return str.replace(/(_)|(\'\W|\'$)|(^\'|\W\')|(\+\+)|([a-zA-Z0-9\ \&\-\.\!\'])|(.)/g,function(car,p1,p2,p3,p4,p5,p6,offset){

   if(p1) return " "; 
   if(p2) return sanitize(p2.slice(1));
   if(p3) return sanitize(p3.slice(0,-1)); 
   if(p4) return p4.slice(0,p4.length-p4.length%2); 
   if(p5) return car;
   if(p6) return ""; 
 });
}

function function2(str){

  return str.replace(/(_)|(\++)|([a-zA-Z0-9\ \&\-\.\!])|(\'\W|\'$)|(^\'|\W\')|(\W)/g,function(car,p1,p2,p3,p4,p5,p6){

   if(p1) return " ";
   if(p2) return p2.slice(0,p2.length-p2.length%2); 
   if(p3) return car; 
   if(p4) return p4.slice(1); 
   if(p5) return p5.slice(0,-1); 
   if(p6) return "";
 });
}

【问题讨论】:

  • 那么function1function2在哪里?!
  • 我已经添加了功能

标签: javascript regex node.js performance


【解决方案1】:

javascript 是同步的。您应该编写异步代码以查看实际结果

我尝试提供相同的功能并在不同的循环中运行两次,但我得到了相同功能的不同控制台时间。大多数情况下,第一次测试运行总是需要更长的时间。但是当你添加第三个循环时,有时第二个会更快,通常第三个是最快的。它必须与浏览器功能有关。

function test(){
        console.time("second_test");
        for( i=0;i<10000;i++)
            result=function2("str");
        console.log(result);
        console.timeEnd("second_test");


        function test2() {
            console.time("first_test");
            for (i = 0; i < 10000; i++)
                result = function2("str");
            console.log(result);
            console.timeEnd("first_test");
        }
        return test2()
    }


    test();

【讨论】:

  • 那没有任何改变。为什么会这样?
猜你喜欢
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多