循环是否真的更快?

我已经听过好几次了。 向后计数时JavaScript循环速度真的快吗? 如果是这样,为什么? 我见过一些测试套件的例子,显示反向循环更快,但我找不到任何解释为什么!

我假设这是因为循环不再需要评估一个属性,每次检查它是否完成,它只是检查最终的数值。

for (var i = count - 1; i >= 0; i--)
{
  // count is only evaluated once and then the comparison is always on 0.
}

这并不是说i--快于i++ 。 事实上,他们都同样快。

上升循环需要花费的时间是对每个i计算数组的大小。 在这个循环中:

for(var i = array.length; i--;)

当你声明i时,你只评估一次.length ,而对于这个循环

for(var i = 1; i <= array.length; i++)

每当你增加i ,你评估.length ,当你检查i <= array.length

在大多数情况下,你甚至不应该担心这种优化


这家伙在很多浏览器中比较了很多javascript中的循环。 他还有一个测试套件,所以你可以自己运行它们。

在所有情况下(除非我在阅读中遗漏了一个)最快的循环是:

var i = arr.length; //or 10
while(i--)
{
  //...
}

我试图用这个答案给出一个广泛的图片。

括号内的下列想法我相信的,直到我最近测试了这个问题:

[[就C / C ++等低级语言而言,编译代码时,处理器在变量为零(或非零)时具有特殊的条件跳转命令。
另外,如果你关心这个优化,你可以去++i而不是i++ ,因为++i是单处理器命令,而i++意味着j=i+1, i=j 。]]

真正快速的循环可以通过展开来完成:

for(i=800000;i>0;--i)
    do_it(i);

它可能比方式慢

for(i=800000;i>0;i-=8)
{
    do_it(i); do_it(i-1); do_it(i-2); ... do_it(i-7);
}

但是其原因可能相当复杂(仅仅提到,游戏中存在处理器命令预处理和缓存处理的问题)。

高级语言而言 ,就像您所问的JavaScript一样,如果您依赖库,内置函数进行循环,则可以对其进行优化。 让他们决定如何做到最好。

因此,在JavaScript中,我会建议使用类似的东西

array.forEach(function(i) {
    do_it(i);
});

它也不太容易出错,浏览器有机会优化你的代码。

[备注:不仅浏览器,但你也有一个容易优化的空间,只需重新定义forEach函数(依赖于浏​​览器),以便它使用最新的最好的欺骗! :) @AMK说,在特殊情况下,它值得使用array.poparray.shift 。 如果你这样做,把它放在窗帘后面。 最大的矫枉过正是为forEach添加选项来选择循环算法。]

而且,对于低级语言,最好的做法是在复杂的循环操作中使用一些智能库函数(如果可能的话)。

这些库还可以将事物(多线程)放在背后,专业程序员也可以随时更新它们。

我做了一些更仔细的研究,结果发现,在C / C ++中,即使对于5e9 =(50,000x100,000)的操作,如果测试是针对像@alestanis所说的常量进行的那么在上升和下降之间没有区别 。 (JsPerf的结果有时不一致,但总体来说,结果是一样的:你不能做出很大的改变。)
所以--i恰好是一个“豪华”的东西。 它只会让你看起来更好的程序员。 :)

另一方面,在这种5e9的情况下展开,当我走了10秒时,它从12秒降到了2.5秒,而当我走了20秒时,我下降了2.1秒。 它没有优化,优化带来了无法估量的时间。 :)(展开可以按照我上面的方式完成,也可以使用i++ ,但是这不会在JavaScript中提前实现。)

总而言之:保持i-- / i++++i / i++与求职面试的不同之处,坚持array.forEach或其他复杂的库函数。 ;)

链接地址: http://www.djcxy.com/p/86589.html

上一篇: Are loops really faster in reverse?

下一篇: Why switch is faster than if