1

当循环结构引起我的注意时,我正在浏览一些 JavaScript 代码。它并没有什么特别之处,而是以一种与我不同的方式进行迭代。当我需要循环一些不依赖于顺序的东西时,我通常会计数,从头到尾迭代,如下所示:

do
{
    // I feel like I'm going in circles
    i++;
} while (i < length)

然而,这个 JavaScript 函数倒计时,从头到尾循环。

var i = data.length - 1;
if(i >= 0)
{                   
    do
    {
        // Around and around, we go                     
    }while(i--)
}

向下计数有什么好处还是只取决于开发人员的偏好?

4

5 回答 5

4

我你正在从数组中删除东西,倒退会更好。

考虑你有一个包含 10 个东西的数组,你最终想要通过在循环期间执行的一些条件来删除索引 3 和 4 处的项目。你正在增加你的计数器。当您在 3 处移除时,阵列相对于计数器会发生什么情况?数组长度缩小到 9,索引 4 处的内容现在位于索引 3,并且您将计数器增加到 4。您只是跳过了要删除的内容。如果你倒退,你就避免了这个问题。

此外,倒退更快,因为处理器可以将索引与 0 进行比较,而不是将索引与随机数进行比较。

于 2012-07-31T15:22:12.657 回答
0

嗯。理论上不,循环使用 for 或使用 while 应该没有区别,但这是我的 2 美分。查看是否存在差异的唯一方法是进行性能测试,一个使用while,另一个使用for,比如说100万个元素,计算执行时间并自己看看。循环有很多优化技术(无论是 for 还是 while),最常见的一种是在一个循环中进行多次迭代。示例:一个标准的 for 循环是:

var i;
for (i=0;i < N; i++) {
    bla();
}

现在我们通过在每次迭代中执行相同的多次来优化它

var i;
    for (i=0;i < N; i+=5) {
        if (i < N-5) {
          bla();
          bla();
          bla();
          bla();
          bla();
        }
    }
for (j=i; j <N;j++){
  bla();
}

这种方式保证了更少的迭代次数。根据您每次迭代的操作以及数组/堆栈的大小,它可以提供更好的性能。有很多关于如何提高循环性能的文章

于 2012-07-31T15:27:18.427 回答
0

可能不是。开发人员很可能只是想倒数。

但是,标准的 0 到 length-1 循环并不总是理想的。例如,在特定的缓存架构下,无论出于何种原因,反向访问结构的元素可能会更快。我想不出任何合理的情况会在 JavaScript 中发生这种情况,但它确实发生在基于应用程序的语言中,尤其是像 C 这样的相对低级的语言。

于 2012-07-31T15:20:47.240 回答
0

引用类似的 SO 问题/答案:

因为您的转发条件每次都必须接收数组的长度属性,而另一个条件只需要检查“大于零”,这是一项非常快速的任务。

循环迭代-Bergi

于 2012-07-31T15:25:34.490 回答
0

我看到至少一项研究表明减少的 while 循环是在 JavaScript 中执行循环的最快方法:https ://blogs.oracle.com/greimer/entry/best_way_to_code_a

请注意,这是针对研究中的 JavaScript 引擎的,其他语言/机器实现可能会提供不同的结果。例如,在 C 语言中,优化编译器可能会完全展开您的循环,并且生成的代码根本不会循环。

于 2012-07-31T15:34:23.333 回答