哪种循环方式最快?[出于好奇]
Which is the fastest way to loop? [for curiosity]
>我正在尝试以最快的方式将变量从 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
循环通常是最快的,因为它的开销是其他任何循环中开销最小的。
setTimeout
和setInterval
将是最慢的,因为不遵守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 将for
与while
和胜利进行比较。 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()
的时间
- 如何将HTML id分配给元素,以及如何将JavaScript应用于元素
- 我可以获得相对于被点击元素的确切点击位置吗
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 如何包含特定于每个视图angularjs的javascript文件
- Javascript日期格式类似于ISO,但本地
- toBoolean方法类似于toString
- es6 相当于下划线查找位置
- str.split(someString).join(someOtherString)是否等效于替换
- 州和城市选择框类似于国家细分页面
- 为什么在许多浏览器中drawImage()的性能略好于createPattern()
- 在好奇中创造元素
- 客户端GWT和Maven好奇的安装程序
- 哪种循环方式最快?[出于好奇]
- 我只是对我发现的这个JS感到好奇
- 好奇其他人将如何为此创建后备:som var = 数字 0 ||假
- 好奇!js 链接在文件末尾不起作用
- 为什么第二个函数参数在注释块中?只是好奇
- 好奇:禁用jQuery和Javascript交互,除非用户已登录
- Javascript API fb_dtsg变量很好奇
- 这段代码是干什么用的?(只是好奇)