2

我有两种选择来执行一段代码。该代码基本上重置了三个数组中的所有值。其中两个是 int 数组,一个是布尔值。

选择 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;
}

其中哪一个会更快?鉴于数组可以具有不同的长度并且彼此之间没有关系。

这里有一个很好的讨论。首先列出的答案很好地解释了数组在 javascript 中的实际含义。有兴趣的可以去看看!

4

2 回答 2

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% 无用。由于我认为性能测量没有用,因此我不提供它们。

于 2012-08-23T10:07:20.337 回答
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);
于 2012-08-23T10:10:04.830 回答