Javascript正则表达式性能和缓存

时间:2015-02-17 16:50:18

标签: javascript regex node.js performance

我正在寻找这个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 "";
 });
}

1 个答案:

答案 0 :(得分:-1)

javascript是同步的。你应该编写asyn代码来查看实际结果

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

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();