javascript - JS 循环和填充数组。哪个更快?

标签 javascript arrays optimization loops

我刚看到Nicholas Zakas of Yahoo的视频,在 GoogleTalks 上谈论加速您的网站。他提到的其中一件事是以相反的顺序执行循环以跳过两个比较之一: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”。

所以看起来 Nicholas 最难反对的方法实际上在几乎所有情况下都更快。

我不够聪明,不知道 jQuery 的 each() 方法在幕后发生了什么,但它一定在做正确的事情……对吧?

最佳答案

您设置中的一个缺陷是您的第二个测试实际上不会起作用。你写道:

for (i = len; i--;) {
    array2[i] = $(this).get(0).id;
}

但是this没有在那里定义,所以整个操作会失败。你必须做类似的事情:

var children = $("#newDivTest").children();
for (i = children.length; i--;) {
    array2[i] = children.get(i).id;
}

这导致了比性能更紧迫的问题:尽管调用 jQuery 的 .each() 函数之类的东西确实会导致增加函数调用(以及相关的额外开销),但它们也往往使表达内容变得容易得多您希望代码执行此操作。

引用迈克尔· jackson 的话:“程序优化的第一条规则:不要做。程序优化的第二条规则(仅供专家使用!):先不要做。”

关于javascript - JS 循环和填充数组。哪个更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1260062/

相关文章:

sql - 如何优化SQL

python - 17,000 x 300 矩阵的每个行组合之间的平方差之和

c++ - 为什么 A/<constant-int> 在 A 无符号与有符号时更快?

javascript - 使用 Angular.js 访问 php 数组数据

c - 字符串文字是否常量?

arrays - 给定一个数字列表和一个数字 k,返回列表中的任意两个数字是否相加为 k

javascript - 从另一个弹出窗口打开弹出窗口

php - 如何在MySql循环中使用zclip

javascript - 在初始页面加载后填充时显示绑定(bind)元素

javascript - 数组中的第一个非负元素