如果或测试条件为模块

时间:2018-05-15 13:25:07

标签: javascript performance

以下面的代码为例:

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
    }
}

现在,有时候我不想在数组words上执行测试2,所以当我调用foo()时会有一个布尔参数b。但这使代码测试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 :(得分:0)

您描述的优化称为loop unswitching。根据我的阅读,Java JIT编译器可以进行这种优化。

我不知道V8是否也进行了这种优化。我不会感到惊讶,但我也不会赌它。它还取决于您使用的JavaScript引擎。

旁注:在你的例子中,我认为它不会获得太多收益。如果你在一个巨大的数组上进行迭代,它会有更多的优势。