在Javascript中调用或不调用函数的成本

在Javascript中调用或不调用函数的成本,javascript,function,Javascript,Function,比较: if (myVariable) { doSomething() } function doSomething () { // Work goes here } vs ie我的问题是,在函数外部进行检查并避免上下文切换(我认为这是正确的术语)还是仅仅在函数内部进行检查,因为这会产生如此微小的差异 干杯。我发现第二种方法有助于提高代码的可维护性和可读性。这只会产生很少的开销。在外部执行会更快,因为每次调用函数都会比先检查然后调用函数稍微慢一些 但是为什么要麻烦呢?没有人会

比较:

if (myVariable) {
    doSomething()
}

function doSomething ()
{
    // Work goes here
}
vs

ie我的问题是,在函数外部进行检查并避免上下文切换(我认为这是正确的术语)还是仅仅在函数内部进行检查,因为这会产生如此微小的差异


干杯。

我发现第二种方法有助于提高代码的可维护性和可读性。这只会产生很少的开销。

在外部执行会更快,因为每次调用函数都会比先检查然后调用函数稍微慢一些


但是为什么要麻烦呢?没有人会注意到函数调用与函数调用实际在做什么。效率低下的DOM选择器使您的代码不得不在一个巨大的树结构中搜寻和啄食几根大海捞针,这对性能的威胁要大得多。

可以忽略不计;性能上的差异很小,浏览器处理这一问题的方式似乎有所不同:

编辑:在性能上确实存在差异:大多数浏览器执行方法1的速度稍微快一点

//Method 1:

var t1 = Date.now();

myVariable = true;

for(var i = 0; i < 20000000; i++) {



    function doSomething ()
    {
        Math.sin(Math.cos(0));
    }

    if (myVariable) {
        doSomething()
    }

    myVariable = !myVariable;
}

console.log(Date.now() - t1);







//Method 2:

var t1 = Date.now();

myVariable = true;

for(var i = 0; i < 20000000; i++) {

    function doSomething()
    {
        if (myVariable) {
            Math.sin(Math.cos(0));
        }
    }


    doSomething();

    myVariable = !myVariable;

}

console.log(Date.now() - t1);





//Results:
//Safari:   About the same, former was slightly quicker
//Firefox:  Former was quicker
//Chrome:   About the same, latter was somewhat quicker
//Opera:    Executed the former quicker
//方法1:
var t1=Date.now();
myVariable=true;
对于(变量i=0;i<20000000;i++){
函数doSomething()
{
数学sin(数学cos(0));
}
if(myVariable){
doSomething()
}
myVariable=!myVariable;
}
console.log(Date.now()-t1);
//方法2:
var t1=Date.now();
myVariable=true;
对于(变量i=0;i<20000000;i++){
函数doSomething()
{
if(myVariable){
数学sin(数学cos(0));
}
}
doSomething();
myVariable=!myVariable;
}
console.log(Date.now()-t1);
//结果:
//萨法里:差不多,前者稍微快一点
//火狐:前者更快
//Chrome:差不多,后者稍微快一点
//歌剧:执行前者更快
(虽然第一种方法避免了一些工作,因此速度应该更快,但可能比统计噪声小)


真正重要的是哪种方法最能代表逻辑。经验法则是,函数中的每个语句都应该处于大致相同的抽象级别。条件表达式是否比函数调用更抽象?

好问题!如果myVariable不总是可用,那么第二个示例只有在将变量作为函数的参数时才有效,我不知道这是否明智。另一方面,你可以避免某些错误。在我看来:如果myVariable必须始终为true才能执行函数,请使用示例2。如果是可选的,请使用示例一。如果您询问调用函数的成本,那么肯定会有一些成本,但成本多少取决于JavaScript实现。较新的实现成本更低,但成本仍然存在。注意英镑和便士本身:-)您的
myVariable
总是
true
,因此您没有真正衡量调用函数的成本(因为它总是被调用).您的测试很差,因为您迫使较差的解释器重复数百万次地创建相同的函数。因此,您要测量的是函数创建的开销,而不是函数调用的开销。我将上述代码修改为一个函数,我认为在Chrome上,第一种方法比第二种方法快15%12@Dan哇,这在我的电脑上是一个非常积极的区别;前者快50%!(MacOSX10.6.8上的Chrome16.0.912.75)也许,也许不是。取决于具体情况,不是吗?请更准确地说:问题在于性能差异,而不是可读性或可维护性一个小背景:通常我同意这是一个非常微小的差异,通常不值得关注,但代码是其他人将使用的库,所以它真的不需要成为一个瓶颈。事实上,忘记这一点。我刚刚读了这篇文章,总结一下:我担心娜达。我理解并同意你的观点,那没关系。但是这个问题有一个正确的答案,“这不重要”不是正确的答案。我希望你的回答能清楚地说出正确的答案,并使用“无关紧要”这一点作为事后思考。在99.99%的情况下,这并不重要,但如果您正试图创建一个每秒能够处理数百万个请求的节点web服务器,这在某种程度上可能会很重要。如果您每秒处理数百万个请求,那么这不是您的瓶颈。正确的答案是“遵循最佳设计的规则,而不是最佳优化的规则。”
//Method 1:

var t1 = Date.now();

myVariable = true;

for(var i = 0; i < 20000000; i++) {



    function doSomething ()
    {
        Math.sin(Math.cos(0));
    }

    if (myVariable) {
        doSomething()
    }

    myVariable = !myVariable;
}

console.log(Date.now() - t1);







//Method 2:

var t1 = Date.now();

myVariable = true;

for(var i = 0; i < 20000000; i++) {

    function doSomething()
    {
        if (myVariable) {
            Math.sin(Math.cos(0));
        }
    }


    doSomething();

    myVariable = !myVariable;

}

console.log(Date.now() - t1);





//Results:
//Safari:   About the same, former was slightly quicker
//Firefox:  Former was quicker
//Chrome:   About the same, latter was somewhat quicker
//Opera:    Executed the former quicker