以下面的代码为例:
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
}
}
}
但随后代码变得杂乱无章。这种情况有不同的方法吗?
答案 0 :(得分:0)
您描述的优化称为loop unswitching。根据我的阅读,Java JIT编译器可以进行这种优化。
我不知道V8是否也进行了这种优化。我不会感到惊讶,但我也不会赌它。它还取决于您使用的JavaScript引擎。
旁注:在你的例子中,我认为它不会获得太多收益。如果你在一个巨大的数组上进行迭代,它会有更多的优势。