哪种循环最快? [好奇心]

时间:2016-03-18 20:12:03

标签: javascript jquery loops ecmascript-5

我试图以最快的方式将变量从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万。这就是我衡量这一点的问题,这是最好的方式吗?

4 个答案:

答案 0 :(得分:0)

如果我正确地阅读了您的问题,您希望以最快的方式预先形成某种循环。

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

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

其中,基本的for循环通常是最快的,因为它具有至少任何其他循环的开销。

setTimeoutsetInterval将会更慢,因为0延迟不受尊重。浏览器会设置一些内部最小延迟。

我从未使用它,但我相信postMessage可以毫不拖延地使用。

答案 1 :(得分:0)

我怀疑这些都不是最快的方式,但你必须明白,不同的浏览器之间会有不同之处。

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

答案 2 :(得分:0)

要测量时间,您需要使用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块下面的其余代码可以恢复执行&amp; setInterval块中的代码将开始在后台执行。这是一个非常漂亮的技巧,我已经使用了很多次......但它根本不会加速你的循环。

答案 3 :(得分:-1)

执行测试我发现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()

衡量我的时间