for loop与if条件

时间:2012-08-23 10:04:03

标签: javascript optimization loops if-statement

我有两种方法可以执行一段代码。代码基本上重置了三个数组中的所有值。其中两个是int数组,一个是boolean。

选择1

for (i = 0; i < array1.length; i++)
    array1[i] = 0;

for (i = 0; i < array2.length; i++)
    array2[i] = 0;

for (i = 0; i < array3.length; i++)
    array3[i] = false;

选择2

int limit = <assign the greatest of the array lengths>

for (i = 0; i < limit; i++)
{
    if (i < array1.length)
        array1[i] = 0;

    if (i < array2.length)
        array2[i] = 0;

    if (i < array3.length)
        array3[i] = false;
}

其中哪一项会更快?鉴于阵列可以具有不同的长度并且彼此没有关系。

有一个非常好的讨论here。首先列出的答案很清楚地解释了数组在javascript中实际意味着什么。对于那些有兴趣看看的人来说!

2 个答案:

答案 0 :(得分:6)

这个版本几乎肯定会更快。它也更容易阅读更短,这两个都是比速度更重要的属性(99 +%的时间)。

for (i = 0; i < array1.length; i++)
    array1[i] = 0;

for (i = 0; i < array2.length; i++)
    array2[i] = 0;

for (i = 0; i < array3.length; i++)
    array3[i] = false;

通常,访问内存中最近访问的数据的速度更快。

此版本也不会受到您在第二版中获得的额外分支的影响。

一个足够先进的编译器会将第二个版本转换为第一个版本。

基准测试:微基准测试100%无用,无需先分析整个程序。由于我不认为性能测量是有用的,我不提供它们。

答案 1 :(得分:1)

function reset_array(array, value) {
  var len = array.length;
  array.length = 0;
  while (len--) array.push(value);
}

reset_array(array1, 0);
reset_array(array2, 0);
reset_array(array3, false);