2014-09-27 51 views
1

我一直在阅读很多关于循环。我已经说过,在JavaScript中执行循环的最快方法是当你使用当需要正向计数时,是否有更好,更快,更可读的方法来使循环高效?

var i = 10; while(i - ){console.log(i);}

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

从我所见过的所有,但这是(如你倒计时)

由于这篇文章陈述在点3http://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);} 

我认为这将检查的<双方在每次循环

importantNumber=0; 

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

我认为上面的相当的与第一

importantNumber + = 1;将提高它

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

怎么样一个数字,是极oposite其他

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

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

是否有更好,更快,更可读,少愚蠢方法,使循环高效时向前计数需要吗?

是很重要的,我觉得大循环或按顺序或大阵列和其他大规模计算循环很多时,这是不是在正常情况下

问题
+3

国际海事组织你超过它。只需写出您可以提出的最清晰的代码,并且只有在您能够证明某个特定代码是瓶颈并需要更快运行时才担心效率问题。 – NPE 2014-09-27 10:54:09

+2

如果您正在寻找* efficiency *或* performance *,您应该选择一个更好的**算法**。只有当你在寻找纯粹的*速度*时,你才会这样做微观优化。你几乎不需要。 – Bergi 2014-09-27 10:56:02

+2

请注意,对于(var i = 0; i Bergi 2014-09-27 10:57:22

回答

4

我敢肯定,你遇到这句话之前:“过早优化是万恶之源”。也许你也熟悉这个:“调试比编写代码要困难一倍,因此,如果你尽可能巧妙地编写代码,那么从定义上讲,调试它。“

这两个引号是正确的。你正在谈论编写循环。循环是基本结构,几乎是任何代码的基本构建砖块。将它与建筑墙面比较:是的,通过保留一半的砖块可以节省几美分,并且当你发现自己需要半砖时可以使​​用这些砖块。但它真的值得吗?我的意思是:看看你在这里发布的最后一个片段。由你自己承认,它看起来愚蠢,并不全是可读的。
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]); 

不会执行你指望它(预增VS后递增 - 或减少在这种情况下)的方式。也许你可以在可预见的behavriour,或行为类似于一个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 /铬将所有对象(这当然包括数组)转换为隐藏的类似C++的类,这又意味着操作(访问成员)的操作是,而旧的IE引擎实现了这个魔术属性不同的是,这导致它执行一个数量级较慢。但是:不要担心这种差异。引擎不断发展,当你完成优化循环以在所有浏览器中获得一致的速度时,下一个版本将被发布,并且你可以重新开始。所以TL; TR:

不要介意胡说

1

我一直在阅读了很多关于循环。我lerned是做一个循环在JavaScript的最快方法是,当你[while循环]

循环在现代浏览器的JavaScript的高度优化,通常在之间当前的浏览器几乎没有差别,同时做循环。几年前有差异,但它们在浏览器中不一致,所以一个中更快的不是另一个。

所以,只要使用适合的循环和如果有一个性能问题,调查。它通常与循环的类型很少或根本没有关系。

它看起来像它的速度快,因为它似乎只能做一个检查,同时在同一时间

不一定设置。以这种方式编写代码的打字少​​,但通常分配给测试的分配速度更快(但两者的差别很小),例如,

while (i) { 
    --i; 
} 

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

while (--i) { 
    ... 
} 

但同样,无论使用哪一个,似乎周围的代码的情况下适当的。请参阅Elias关于过早优化的答案。

相关问题