Если или проверить условие как модули - PullRequest
0 голосов
/ 15 мая 2018

Возьмите приведенный ниже код в качестве примера:

function foo(b) {
    var words = [ "Lorem", "ipsum", "dolor", "sit", "amet" ];
    var i;

    for(i in words) {
        /a/.test(words[i]); // test 1
        if(b) {
            /b/.test(words[i]); // test 2
        }
        /c/.test(swordstr[i]); // test 3
    }
}

Теперь иногда я не хочу выполнять тест 2 для массива words, поэтому при выполнении булевого параметра bвызовите foo ().Но это делает код теста b количество words.length раз.Конечно, оптимизация будет выглядеть следующим образом:

function foo(b) {
    var words = [ "Lorem", "ipsum", "dolor", "sit", "amet" ];
    var i;

    if(b) {
        for(i in words) {
            /a/.test(words[i]); // test 1
            /b/.test(words[i]); // test 2
            /c/.test(swordstr[i]); // test 3
        }
    } else {    
        for(i in words) {
            /a/.test(words[i]); // test 1
            /b/.test(words[i]); // test 2
            /c/.test(swordstr[i]); // test 3
        }
    }
}

Но тогда код становится загроможденным.Есть ли другой подход к этой ситуации?

1 Ответ

0 голосов
/ 15 мая 2018

Оптимизация, которую вы описываете, называется отключение контура . Из того, что я прочитал, компилятор Java JIT может выполнять такую ​​оптимизацию.

Я не знаю, выполняет ли V8 и этот вид оптимизации. Я не удивлюсь, но я также не буду делать ставку на это. Это также будет зависеть от того, какой движок JavaScript вы используете.

Примечание: в твоем примере я не думаю, что оно сильно выиграет. Это дает больше преимуществ, если вы перебираете огромный массив.

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