Стоимость вызова функции или нет в Javascript
Для сравнения:
if (myVariable) {
doSomething()
}
function doSomething ()
{
// Work goes here
}
против
doSomething();
function doSomething()
{
if (myVariable) {
// Work goes here
}
}
Т.е. мой вопрос заключается в том, быстрее ли выполнять проверку вне функции и избегать переключения контекста (я думаю, что правильный термин)) или просто сделать это внутри функции, потому что она делает такую незначительную разницу?
Приветствия.
Ответы
Ответ 1
Это просто не имеет значения (хотя первый метод позволяет избежать некоторой работы, поэтому он должен быть быстрее, но на величину, которая, вероятно, меньше статистического шума).
Что действительно важно, какой метод лучше всего представляет собой логику. Правило большого пальца состоит в том, что каждое утверждение в функции должно находиться примерно на одном уровне абстракции. Является ли условное выражение более или менее абстрактным, чем вызов функции?
Ответ 2
Я обнаружил, что второй метод делает более удобный и удобочитаемый код. Это несет очень незначительные накладные расходы.
Ответ 3
Было бы быстрее сделать это за пределами, потому что вызов функции каждый раз будет немного медленнее, чем сначала проверка, а затем вызов функции.
Но зачем беспокоиться? Никто не увидит вызов функции, а не то, что на самом деле выполняет вызов функции. Неэффективные селектора DOM, которые заставляют ваш код охотиться и клевать через огромную древовидную структуру для нескольких игл в стоге сена, представляют гораздо большую угрозу для производительности.
Ответ 4
Это незначительно; различия в производительности минимальны, и браузеры, похоже, справляются с этим по-другому:
Изменить: действительно есть разница в производительности: большинство браузеров быстрее выполняют метод 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