Какая разница в производительности между "пропустить, если условие" и "напрямую вернуться"? - PullRequest
0 голосов
/ 15 марта 2019

Есть ли разница в производительности между следующими 2 функциями:

function a() {
    var a = false;
    if(a == true) {
           ... Many lines, e.g. 1 million lines ...
    }
}

function b() {
    var a = false;
    if (a != true) {
        return;
    }
           ... Many lines, e.g. 1 million lines ...
 }

Какая из них имеет меньшее время выполнения?

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Я не думаю, что есть разница в производительности, но вторая функция лучше для удобства чтения, потому что вам не нужно делать отступы.Также вы можете использовать !a в операторе if во второй функции для лучшей читаемости.

0 голосов
/ 15 марта 2019

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

При загрузке страницы интерпретатор должен просмотреть весь текст, проверитьчто его синтаксис действителен, создайте абстрактное синтаксическое дерево из результата и (на более новых движках) скомпилируйте результат в машинный код.Даже если большая часть тела функции a никогда не выполняется , она все равно должна быть проанализирована .Разбор 1 миллиона строк Javascript - нетривиальная задача.

Когда каждая функция выполняется , a может занять больше времени, чем b, даже если толькобит - например, если a определяет много переменных внутри этих строк, переменные имеют область действия a:

function a() {
    var a = false;
    if(a) {
      var b = 'b';
      var c = 'c';
      // more lines
    }
}

Когда функция запущена, интерпретатор должен просмотреть все переменные, определенные вif блок, который никогда не запускается, так что эти имена переменных могут быть правильно инициализированы.Когда функция запущена, var b; и var c;и любые другие var s будут подняты наверх:

function a() {
  var a;
  var b;
  var c;
  // initialize any other variables local to this function
  a = false;
  if(a) {
    b = 'b';
    c = 'c';
    // more lines
  }
}

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

Напротив, функция, которая не имеет ни избыточных переменных для инициализации, ни множества строк для разбора:

function b() {
    var a = false;
    if (a != true) {
        return;
    }
 }

будет проанализирована, скомпилирована и выполнена быстрее.

...