我从书中学到了你应该写这样的循环:
for(var i=0, len=arr.length; i < len; i++){
// blah blah
}
Run Code Online (Sandbox Code Playgroud)
所以arr.length每次都不会计算.
其他人说编译器会对此做一些优化,所以你可以写:
for(var i=0; i < arr.length; i++){
// blah blah
}
Run Code Online (Sandbox Code Playgroud)
我只是想知道哪种是最好的练习方式?
我不知道这个问题是否在其他语言中有效,但我是专门问这个问题的JavaScript.
我在一些文章和问题中看到,JavaScript中最快的循环是这样的:
for(var i = array.length; i--; )
Run Code Online (Sandbox Code Playgroud)
同样在Sublime Text 2中,当您尝试编写循环时,它建议:
for (var i = Things.length - 1; i >= 0; i--) {
Things[i]
};
Run Code Online (Sandbox Code Playgroud)
我想知道,为什么i--比i++循环更快?
我们的计算机科学老师曾经说过,由于某些原因,倒计时比计数更有效率.例如,如果你需要使用FOR循环并且某个地方没有使用循环索引(比如在屏幕上打印一行N*),我的意思是这样的代码:
for (i = N; i >= 0; i--)
putchar('*');
Run Code Online (Sandbox Code Playgroud)
比以下更好:
for (i = 0; i < N; i++)
putchar('*');
Run Code Online (Sandbox Code Playgroud)
这是真的吗?如果是这样,有谁知道为什么?
在他的书" 更快的网站"中, Steve Sounders写道,提高循环性能的一种简单方法是将迭代器递减到0而不是递增到总长度(实际上这一章是由Nicholas C. Zakas编写的).根据每次迭代的复杂性,此更改可以比原始执行时间节省高达50%的成本.例如:
var values = [1,2,3,4,5];
var length = values.length;
for (var i=length; i--;) {
process(values[i]);
}
Run Code Online (Sandbox Code Playgroud)
这对于for循环,do-while循环和while循环几乎相同.
我想知道,这是什么原因?为什么要这么快地递减迭代器呢?(我对此技术背景感兴趣,而不是在证明此声明的基准测试中感兴趣.)
编辑:乍一看这里使用的循环语法看起来不对.没有length-1或者i>=0,让我们澄清(我很困惑太).
这是循环语法的一般:
for ([initial-expression]; [condition]; [final-expression])
statement
Run Code Online (Sandbox Code Playgroud)
初始表达 -var i=length
首先评估此变量声明.
条件 -i--
在每次循环迭代之前计算此表达式.它将在第一次通过循环之前递减变量.如果此表达式求值为false循环结束.在JavaScript中是0 == false这样的,如果i最终等于0它被解释为false并且循环结束.
最终表达
在每次循环迭代结束时(在下一次条件评估之前)评估该表达式.这里不需要它是空的.所有三个表达式在for循环中都是可选的.
for循环语法不是问题的一部分,但因为它有点不常见,我认为澄清它是有趣的.也许有一个原因是它更快,因为它使用较少的表达式(0 == false"技巧").
给定具有阵列.length 100包含具有值的元素0,以99在相应的索引,其中,所述要求是找到的阵列等于元件n:51.
为什么使用循环从数组的开始迭代到结束比从开始到结束和结束开始更快地迭代?
const arr = Array.from({length: 100}, (_, i) => i);
const n = 51;
const len = arr.length;
console.time("iterate from start");
for (let i = 0; i < len; i++) {
if (arr[i] === n) break;
}
console.timeEnd("iterate from start");Run Code Online (Sandbox Code Playgroud)
const arr = Array.from({length: 100}, (_, i) => i);
const n = 51;
const len = arr.length;
console.time("iterate from start and end");
for (let i = 0, k …Run Code Online (Sandbox Code Playgroud)我有一个简单的FOR语句,如下所示:
var num = 10,
reverse = false;
for(i=0;i<num;i++){
console.log(i);
}
Run Code Online (Sandbox Code Playgroud)
当反向为假时,我希望它返回类似[0,1,2,3,5,5,7,8,9]的内容
但是,当反向为真时,它应该返回[9,8,7,6,5,4,3,2,1,0]
获取此结果的最有效方法是什么,如果在循环内反转为true或false ,则不检查每次?
我不想这样做:
var num = 10,
reverse = false;
for(i=0;i<num;i++){
if(reverse) console.log(num-i)
else console.log(i)
}
Run Code Online (Sandbox Code Playgroud)
我想在循环外只检查一次反向.
在这个网站上有一个for循环变化列表.我可以理解for(var i=0, len=arr.length; i<len ;i++)循环的用法(在哪里arr是一个数组),因为arr.length在每一步都没有计算,似乎有一个边际性能增益.但是使用其他变体有什么好处?例如,循环就像
for (var i=arr.length; i--;)for (var i=0, each; each = arr[i]; i++)通过使用不同的for循环变化,性能是否有任何明显的变化?我通常for(var i=0, len=arr.length; i<len ;i++)甚至用于非常大的数组.所以我只是想知道我是否遗漏了一些东西.
我不相信jsperf测量for循环与forEach性能的结果.至少对我的机器上的chrome和firefox来说,结果与jsperf中广告的结果完全不同.
http://jsperf.com/foreach-vs-loop(我的)
http://jsben.ch/#/BQhED(更受欢迎)
在我的笔记本电脑上运行Ubuntu 11.10我在Firefox中有以下结果:
for: total=1641 ms, avg=164.1 ms
forEach: total=339 ms, avg=33.9 ms
uname -a:
Linux 3.0.0-16-generic #29-Ubuntu SMP Tue Feb 14 12:48:51 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
很遗憾,Chrome不会返回console.timeEnd()的结果,但Chrome的运行时间相同而且速度更快.我观察到forEach比Chrome中的循环快10倍,在Firefox中快3倍.
在Chrome中,我得到大约这些运行时间:
for: avg=80 ms
forEach: avg=6 ms
Run Code Online (Sandbox Code Playgroud)
这是我在Firefox和Chrome控制台中运行的代码.
var arr = [];
for(var i = 0; i < 100000; i++) arr[i]=i;
var numberOfRuns = 10;
function time(name, f){
console.time(name);
f();
return console.timeEnd(name);
}
function runTest(name, f){
var totalTime = 0;
for(var r = 0; r < …Run Code Online (Sandbox Code Playgroud) 几个问题:
是一个常规的javascript循环(循环一系列元素)比使用jQuery更快/更高效each()?
如果是这样,将以下代码编写为常规javascript循环的最佳方法是什么?
$('div').each(function(){ //... })
我刚刚安装了Aptana Studio进行开发,其中一个可用的Javascript命令是Insert a for循环,如下所示:
for (var i=0; i < Things.length; i++) {
Things[i]
};
Run Code Online (Sandbox Code Playgroud)
另一个选项是Insert Improved for loop,如下所示:
for (var i = Things.length - 1; i >= 0; i--){
Things[i]
};
Run Code Online (Sandbox Code Playgroud)
为什么最后一个比第一个好?
javascript ×9
performance ×8
loops ×4
for-loop ×3
algorithm ×1
arrays ×1
c ×1
iteration ×1
jquery ×1
jsperf ×1
optimization ×1