在需要向前计数时,是否有更好,更快,更易读的方法使循环更有效?

时间:2014-09-27 10:51:22

标签: javascript loops increment

我一直在阅读很多关于循环的内容。我已经知道,在javascript中执行循环的最快方法是

var i = 10; 而(I - ){的console.log(I);}

这将从零开始,因为零是假的。它看起来很快,因为它似乎只做一次检查,同时也设置(每个浏览器执行不同,请不要拍我!)

从我所看到的一切来看,这并不总是实际的(因为你倒计时)

正如本文所述第3点 http://gamealchemist.wordpress.com/2013/05/01/lets-get-those-javascript-arrays-to-work-fast/;你可能正在循环一个数组并引用

  

"因为全世界的所有CPU缓存都希望处理过程“直接”"

此外,如果您需要循环中的数字++进行类似的计算

for(var importantNumber=0;importantNumber<10;importantNumber++){console.log(importantNumber);}

我认为这将检查&lt;在每个循环上

importantNumber=0;

while(importantNumber<10){console.log(importantNumber);importantNumber++;}

我认为上面与第一个

非常相似

importantNumber + = 1;会改善它

while(importantNumber<10){console.log(importantNumber);importantNumber+=1;}

一个极地对面的数字怎么样

var i=[0,10];// i[0] is the importantNumber

while(i[1]-=1){console.log(i[0]);i[0]+=1;}

当需要进行前向计数时,是否有更好,更快,更易读,更少愚蠢的方式使循环更有效?

重要的是,我觉得在处理大循环或顺序或大数组中的许多循环以及大规模计算时,这在正常情况下不是问题

2 个答案:

答案 0 :(得分:4)

我确定您之前已经看过这句话:&#34;过早优化是所有邪恶的根源&#34; 。也许你也熟悉这个:&#34;调试是第一次编写代码的两倍。因此,如果您尽可能巧妙地编写代码,那么根据定义,您不够聪明,无法对其进行调试。&#34;

这两个引用都是真的。你在谈论写循环。循环是基本结构,是(几乎)任何代码的基本构建块。将它与建造墙壁进行比较:是的,你可以通过将砖块分成两半来节省几美分,当你发现自己需要半块砖时可以使​​用那些一半。但这真的值得吗?我的意思是:看看你在这里发布的最后一个片段。你自己承认,它看起来像高飞,并且不是所有可读的。
KISS是关键:也许,在某些情况下,在某些JS引擎上,递减的while循环将胜过递增的for循环,但 您正在编写JavaScript 不是C或汇编。你正在写JS的这一事实意味着失去或获得一些微秒并不会引人注意。

这一切都归结为常识:写下您知道的内容,然后编写它以便您可以一目了然地理解代码。
如果那意味着写作:

var i=10;
while(i--)//note, this will never log array[0]!!!
    console.log(array[10-i]);

然后我不得不说:得到帮助,但无论如何。如果这对您来说最具可读性,那就是您所写的内容。但是,我会这样说:

while( --i)
    console.log(array[10-i]);

不会以您期望的方式执行(预增量与后增量 - 或在此情况下减少)。在可预测的行为方面,或者类似于for循环的行为,你可以使用while循环获得的最接近的可能是其中之一:

var i = 0;
while(i < array.length)
    console.log(array[i++]);
//or
i = array.length;
while(i)
    console.log(array[array.length - (i--)]);

但是,与以下相比,让我们说实话:

for (var i = 0;i<array.length;++i)
    console.log(array[i]);

我说很明显哪些代码最有意义。可能会影响性能的是array.length如何实现。 Chrome / chromium将所有对象(当然包括数组)转换为隐藏的C ++类,这反过来意味着array.length O(1)操作(访问成员),而旧的IE引擎以不同的方式实现了这种魔法属性,导致它执行速度慢一个数量级。但是:不要担心这种差异。引擎发展,当您完成优化循环以在所有浏览器中获得一致的速度时,下一个版本将被释放,您可以重新开始。 TL; TR:

别介意Bollocks

答案 1 :(得分:1)

  

我一直在阅读很多关于循环的内容。我已经知道在javascript中循环的最快方法就是你[循环时]

在现代浏览器中javascript中的循环是高度优化的,当前浏览器在for,while和do循环之间通常很少或没有区别。几年前存在差异,但它们在不同浏览器中存在差异,因此在另一个浏览器中速度较快的情况并不存在。

因此,只需使用适合的循环,如果存在性能问题,请进行调查。它通常与循环类型几乎没有任何关系。

  

它看起来很快,因为它似乎只做了一次检查,同时也设置了

不一定。用这种方式编写它的打字较少,但通常分别对测试进行分配会更快(但差异很小),例如。

while (i) {
  --i;
}

可能更快,或者至少不慢,

while (--i) {
  ...
}

但是,再次使用在周围代码的上下文中看起来合适的东西。见Elias&#39;关于过早优化的答案。