哪种循环方式最快?[出于好奇]

Which is the fastest way to loop? [for curiosity]

本文关键字:于好奇 好奇 循环 方式最      更新时间:2023-09-26

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

var i = 0;
while(i <= 1000000){
  i++;
}
//VS
var i = 0;
setInterval(function(){
  if(i <= 1000000){
    i++
  }
},0)
//OTHER OPTIONS
//...

如何衡量呢?

更新

我想

我表达错了,我想通过逐个添加到变量中来实际达到 100 万。这就是我衡量的问题,这是最好的方法吗?

如果我没看错你的问题,你想计时最快的方法来执行某种循环。

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

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

其中,基本for循环通常是最快的,因为它的开销是其他任何循环中开销最小的

setTimeoutsetInterval将是最慢的,因为不遵守0延迟。浏览器确实设置了一些内部最小延迟。

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

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

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

setInterval就像一个睡眠定时器。对于 0ms,它唯一有用的就是将进程推送到后台。它将同步阻塞进程转换为异步阻塞进程。然后,setInterval 块下面的其余代码可以恢复执行,setInterval 块中的代码将开始在后台执行。这是一个非常漂亮的技巧,我已经用过很多次了......但它根本不会加快您的循环速度。

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

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

执行测试 我发现在这种情况下,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()的时间