为什么那些Javascript代码段执行相同的操作?

时间:2013-01-18 20:29:13

标签: javascript performance benchmarking

obj = [1,2,3,4,5];
function iter(){
    for (var key in obj){
        key=key+key;
    };
};
function test1() { 
    iter(obj); 
};
function test2(){
    (function iter(obj){
        for (var key in obj){
            key=key+key;
        };
    })(obj);    
};

这里,test1和test2都执行相同的操作,即使test2每次调用时都会创建一个新函数。为什么呢?

3 个答案:

答案 0 :(得分:6)

我的猜测是性能没有差异,因为代码中没有(有意义的)差异。解析器在解析代码时在iter内创建本地test2函数,而不是每次调用test2时。 (这与使用eval不同。)如果有的话,第二个会快一点,因为objiter函数的本地。嗯,那个错了。

this jsperf test所示,第二个确实较慢。你必须小心测量。编写函数的方式,函数体中完成的工作量很容易掩盖两种情况下涉及的函数调用开销的差异。此外,第一种情况是访问全局obj,而第二种情况是访问参数。应尽可能消除这些差异,仅衡量您要测量的内容。我写的jsperf测试试图做到这一点。

答案 1 :(得分:1)

我几乎可以保证你不会在5个周期内看到性能差异。在现代JS引擎中,您需要使用千倍甚至数万个范围内的迭代来测试它,以实际看到差异。但是,这种差异最终肯定会出现。

答案 2 :(得分:1)

Your are right, they do more or less perform the same

你的第二个函数,其中有一个闭包,每次调用时都会产生一个匿名函数的开销。

在第一个中,js可以调用它已存储的函数。

这导致第二个功能稍慢一点。