Optimization 优化`我--`vs.`i++`

Optimization 优化`我--`vs.`i++`,optimization,loops,Optimization,Loops,我正在浏览一些JavaScript代码,这时一个循环结构引起了我的注意。它并没有什么特别之处,而是以一种不同于我所做的方式进行迭代。当我需要循环一些不依赖于顺序的东西时,我通常会进行计数,从头到尾进行迭代,如下所示: do { //我觉得我好像在兜圈子 i++; }while(i=0) { 做 { //转啊转,我们走 }而(我--) } 向下计数有什么好处,还是取决于开发者的喜好?可能没有。很可能开发人员只是想倒数 但是,标准的0到1长度循环并不总是理想的

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

do
{
//我觉得我好像在兜圈子
i++;
}while(i
然而,这个JavaScript函数倒计时,从一端循环到另一端

var i=data.length-1;
如果(i>=0)
{                   
做
{
//转啊转,我们走
}而(我--)
}

向下计数有什么好处,还是取决于开发者的喜好?

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


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

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


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

如果要从数组中删除内容,则向后走会更好

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


此外,由于处理器将索引与0进行比较的速度比将索引与随机数进行比较的速度快。

如果要从数组中删除内容,则向后比较更好

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


此外,因为处理器将索引与0进行比较的速度比将索引与随机数进行比较的速度快。

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

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


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

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


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

var i;
for (i=0;i < N; i++) {
    bla();
}
vari;
对于(i=0;i
现在,我们通过在每次迭代中执行相同的多次来优化它

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();
}
vari;
对于(i=0;i对于(j=i;jHmmm)。理论上不,循环使用for和使用while应该没有区别,但这是我的2美分。
看是否有差异的唯一方法是做一个性能测试,一个使用while,另一个使用for,比方说在一百万个元素上,计算执行时间,自己看看。
有许多优化技术可以循环(无论是for还是while),其中最常见的是在一个循环中进行多次迭代。例如:
循环的标准是:

var i;
for (i=0;i < N; i++) {
    bla();
}
vari;
对于(i=0;i
现在,我们通过在每次迭代中执行相同的多次来优化它

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();
}
vari;
对于(i=0;i对于(j=i;j我至少看到一项研究表明,在JavaScript中,减少while循环是执行循环的最快方法:


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

我至少看到一项研究表明,减少while循环是最快的方法JavaScript中的循环:


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

更糟-如果迭代动态数组集合并删除某些对象,则会将我会导致超支