局部变量和循环
另一种提高循环性能的简单方法是将迭代器向 0 递减,而不是向总长度递增。根据每次迭代的复杂性,进行这个简单的更改可以节省高达
50% 的原始执行时间。
取自:http: //oreilly.com/server-administration/excerpts/even-faster-websites/writing-efficient-javascript.html
- 尝试将 保存
nodes.length
为局部变量,这样循环就不必每次都计算它。
- 此外,
nodes.get(i)
如果您经常访问该数据,您可以将其存储到局部变量中以节省一些时间。
- 如果顺序不重要,请考虑将 for 循环递减到 0。
- jQuery 的
each()
循环也比自己循环遍历集合要慢一些。你可以看到这里有一个明显的区别。
非常简单的例子
您会在我的示例中看到,我将循环压缩为一个while
循环:
var nodes = $(".rr span");
var i = nodes.length;
while(i--){
if(i%2 === 0){
nodes.get(i).style.color = "blue";}
}
请注意,循环在每次迭代中while
递减。i
这样,当 时i = 0
,循环将退出,因为while(0)
计算结果为false
。
“分块”阵列
chunk() 函数旨在处理小块中的数组
(因此得名),并接受三个参数:“待办事项”列表,
处理每个项目的函数,以及用于设置值的可选上下文
变量在 process() 函数中。计时器用于延迟每个项目的处理(在这种情况下为 100 毫秒,但可以根据您的具体用途随意更改)。每次通过时,数组中的第一项都会被删除并传递给 process() 函数。如果还有待处理的项目,则使用另一个计时器重复该过程。
看看这里定义的Nick Zakas的chunk
方法,如果您需要分段运行循环以减少浏览器崩溃的机会:
function chunk(array, process, context){
setTimeout(function(){
var item = array.shift();
process.call(context, item);
if (array.length > 0){
setTimeout(arguments.callee, 100);
}
}, 100);
}
使用createDocumentFragment()
由于文档片段在内存中而不是主 DOM 树的一部分,因此将子片段附加到它不会导致页面重排(计算元素的位置和几何形状)。因此,使用文档片段通常会带来更好的性能。
所有浏览器都支持 DocumentFragment ,甚至 Internet Explorer 6,因此没有理由不使用它们。
回流是计算布局引擎格式化对象的几何形状的过程。
由于您正在迭代地更改这些元素的显示属性,因此页面必须为每次更改“重新绘制”窗口。如果您createDocumentFragment
在那里使用并进行所有更改,然后将它们推送到 DOM,您将大大减少repainting
必要的数量。