哪种循环方式最快? [出于好奇]
Which is the fastest way to loop? [for curiosity]
我正在尝试以最快的方式将变量从 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万。这就是我衡量的问题,最好的方法是什么?
如果我没看错你的问题,你想以最快的方式执行某种循环。
JavaScript 中有许多循环结构,包括:
for
while
do... while
- 递归
setTimeout/setInterval
for...in
for...of
- 发电机
其中,基本 for
循环通常是最快的,因为它的开销比其他任何循环都要 最少。
setTimeout
和 setInterval
将是较慢的,因为 0
延迟未得到遵守。浏览器确实设置了一些内部最小延迟。
我没用过,但相信有postMessage
可以用,不用耽误。
我怀疑这两种方法都不是最快的方法,但您必须了解,随着实现的不同,浏览器之间也会存在差异。
setInterval
肯定是最慢的,因为JavaScript运行在单线程环境中。即使延迟为 0,您所做的只是在引擎空闲时将回调函数排队,直到循环完成。
最有可能成为标准 for 循环的最快方法:
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 将 for
与 while
进行比较并确定胜负。 http://jsperf.com/looptoamillion/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 块中的代码将开始在后台执行。这是一个非常漂亮的技巧,我已经使用了很多次......但它根本不会加快你的循环。
执行测试我发现 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()
来衡量时间
我正在尝试以最快的方式将变量从 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万。这就是我衡量的问题,最好的方法是什么?
如果我没看错你的问题,你想以最快的方式执行某种循环。
JavaScript 中有许多循环结构,包括:
for
while
do... while
- 递归
setTimeout/setInterval
for...in
for...of
- 发电机
其中,基本 for
循环通常是最快的,因为它的开销比其他任何循环都要 最少。
setTimeout
和 setInterval
将是较慢的,因为 0
延迟未得到遵守。浏览器确实设置了一些内部最小延迟。
我没用过,但相信有postMessage
可以用,不用耽误。
我怀疑这两种方法都不是最快的方法,但您必须了解,随着实现的不同,浏览器之间也会存在差异。
setInterval
肯定是最慢的,因为JavaScript运行在单线程环境中。即使延迟为 0,您所做的只是在引擎空闲时将回调函数排队,直到循环完成。
最有可能成为标准 for 循环的最快方法:
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 将 for
与 while
进行比较并确定胜负。 http://jsperf.com/looptoamillion/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 块中的代码将开始在后台执行。这是一个非常漂亮的技巧,我已经使用了很多次......但它根本不会加快你的循环。
执行测试我发现 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()