【问题标题】:Which is the fastest way to loop? [for curiosity]哪种循环方式最快? [出于好奇]
【发布时间】:2016-03-18 20:12:03
【问题描述】:

我正在尝试以最快的方式将变量从 0 增加到 1000000。在这种情况下,我需要增加变量值并测量运行所有这些循环的时间。我应该使用while 循环,还是使用setInterval()0 的时间间隔最快?

var i = 0;
while(i <= 1000000){
  i++;
}

//VS

var i = 0;
setInterval(function(){
  if(i <= 1000000){
    i++
  }
},0)

//OTHER OPTIONS
//...

以及如何衡量?

更新

我想我表达自己错了,我想把变量一一加到100万。这就是我衡量的问题,这是最好的方法吗?

【问题讨论】:

  • 最快的方法是添加1000000
  • 为什么?这是某种瓶颈吗?而且我认为您的第二种方法会使浏览器崩溃。
  • 我不推荐 setInterval 方法,但如果你使用它,请确保在完成后清除间隔。当前代码将永远运行区间。
  • 很少有 JSPerfs 已经为此设置:jsperf.com/fastest-array-loops-in-javascript/24jsperf.com/loops/33 就是很好的例子。

标签: javascript jquery loops ecmascript-5


【解决方案1】:

如果我没看错你的问题,你想以最快的方式进行某种循环。

JavaScript 中有许多循环结构,包括:

  • for
  • while
  • do... while
  • 递归
  • setTimeout/setInterval
  • for...in
  • for...of
  • 发电机

其中,基本的for 循环通常是最快的,因为它的开销最少

setTimeoutsetInterval 会比较慢,因为 0 延迟不受支持。浏览器确实设置了一些内部最小延迟。

我没用过,但我相信有postMessage可以毫不拖延地使用。

【讨论】:

  • 你忘记了 jQuery :P
  • 我想不出特定于 jquery 的循环技术。我尝试过
  • jQuery 永远不会比标准 JavaScript 更快,因为它只是一个返回到 JavaScript 的包装 API。
【解决方案2】:

要测量时间,您需要使用 JavaScript 的 date 对象。

var startTime = Date.now(); // Unix time in ms.
// ... Run the Loop here ...
var endTime = Date.now();
var diff = endTime - startTime;

setInterval 就像一个睡眠定时器。 0ms 唯一的好处是将进程推到后台。它将同步阻塞进程转变为异步阻塞进程。该 setInterval 块下方的其余代码然后可以恢复执行,并且 setInterval 块中的代码将开始在后台执行。这是一个非常漂亮的技巧,我已经用过很多次了……但它根本不会加速你的循环。

【讨论】:

    【解决方案3】:

    我怀疑这两种方法都不是最快的方法,但您必须了解,随着实现的不同,浏览器之间会存在差异。

    setInterval 肯定是最慢的,因为 JavaScript 在单线程环境中运行。即使延迟为 0,您所做的只是将回调函数排队等待引擎空闲的时间,直到您的循环完成。

    最快的方法很可能是标准的循环:

     var startTime = new Date();
     for(var i = 0; i < 1000000; ++i){
    
          // Each iteration of the loop will make i
          // have a different value inside the loop
    
     }
     var diff = Math.abs(new Date() - startTime);
    
     console.log(diff);
    

    此 jsPerf 将 forwhile 进行比较并获得胜利。 http://jsperf.com/looptoamillion/2

    【讨论】:

      【解决方案4】:

      执行测试我发现for 循环是这种情况的更好选择:

      for(var i = 0; i < 1000000; ++i){
      
            // Each iteration of the loop will make i
            // have a different value inside the loop
      
       }
      

      为了衡量我使用console.time()console.timeEnd() 的时间

      【讨论】:

        猜你喜欢
        • 2017-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-08
        • 1970-01-01
        • 2013-03-11
        • 2010-11-05
        相关资源
        最近更新 更多