Стоимость вызова функции или нет в Javascript - PullRequest
17 голосов
/ 26 января 2012

Сравнить:

if (myVariable) {
    doSomething()
}

function doSomething ()
{
    // Work goes here
}

против

doSomething();

function doSomething()
{
    if (myVariable) {
        // Work goes here
    }
}

т.е. у меня вопрос: быстрее ли выполнять проверку вне функции и избегать переключения контекста (я думаю, что это правильный термин)) или просто делать это внутри функции, потому что это имеет столь незначительное значение?

Приветствие.

Ответы [ 4 ]

13 голосов
/ 26 января 2012

Это просто не имеет значения (хотя первый метод позволяет избежать некоторой работы, поэтому он должен работать быстрее, но на величину, которая, вероятно, меньше статистического шума).

Что действительно имеет значениекакой метод лучше всего представляет логику.Практическое правило заключается в том, что каждое утверждение в функции должно быть примерно на одном уровне абстракции.Является ли условное выражение более или менее абстрактным, чем вызов функции?

1 голос
/ 26 января 2012

Было бы быстрее сделать это снаружи, потому что каждый раз вызывать функцию будет немного медленнее, чем сначала проверять, а потом вызывать функцию.

Но зачем?Никто не собирается замечать вызов функции против того, что фактически делает вызов функции.Неэффективные селекторы DOM, которые заставляют ваш код искать и прокручивать огромную древовидную структуру нескольких иголок в стоге сена, представляют гораздо большую угрозу для производительности.

1 голос
/ 26 января 2012

Это незначительно; различия в производительности незначительны, и браузеры, похоже, справляются с этим по-разному:

Редактировать: действительно есть разница в производительности: большинство браузеров выполняют метод 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 голос
/ 26 января 2012

Я считаю, что второй метод обеспечивает более удобный и читаемый код.Это требует очень мало накладных расходов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...