【发布时间】:2012-08-01 04:09:44
【问题描述】:
我刚刚在 GoogleTalks 上看到了 Nicholas Zakas of Yahoo 的视频,谈论加快您的网站速度。他提到的其中一件事是以相反的顺序执行循环以跳过两个比较之一:for (i = len; i--;) {}
他说要远离 for each 的 JS 库实现。只是为了好玩,我想我会尝试一下。原来他错了。
var array1 = new Array();
var array2 = new Array();
var start = 0;
var finished = 0;
start = (new Date).getTime();
$("#newDivTest").children().each(function(i){
array1[i] = $(this).get(0).id;
});
finished = (new Date).getTime() - start;
alert(finished);
start = (new Date).getTime();
var len = $("#newDivTest").children().length;
for (i = len; i--;) {
array2[i] = $(this).get(0).id;
}
finished = (new Date).getTime() - start;
alert(finished);
newDivTest 包含 1000 个空 div,其 id 从“0”开始,一直到“999”。另一个注意事项是 $(this).get(0).id 由于某种原因比 $(this).attr("id") 快大约 3 倍,有人知道为什么吗?
对于FF3.5,结果是“7”和“45”,IE7给出“30”和“45”,Chrome2给出“4”和“17”,Opera10给出“16”和“16”,而最后 Safari4 给出“4”和“16”。
所以看起来尼古拉斯最难对付的方法实际上在几乎所有情况下都更快。
我不够聪明,不知道 jQuery 的 each()-方法在幕后发生了什么,但它一定做对了……对吧?
【问题讨论】:
-
这不应该工作,因为在 "array2[i] = $(this).get(0).id;"这是一个全局范围,而不是一个 div。
-
这类问题的存在让我烦恼不已。经过 50 年的编译器技术,程序员仍然必须手动执行这些微优化!
标签: javascript arrays optimization loops