Javascript:多次运行功能的神秘滞后

时间:2010-07-08 02:50:14

标签: javascript profiling

以下函数只返回文档中具有指定标记名的元素。由于某些原因,在连续调用函数时,它的执行变得越来越慢..我已经彻底测试了它并且原因中的for循环行,但是我不明白为什么这会导致连续调用的速度减慢

function getElementsByTagName2(tagName){
    var arr=new Array();
    var elems=document.getElementsByTagName(tagName);
    for(var i=0, len=elems.length; i!=len; arr.push(elems[i++]));
    return arr
}

编辑:更改变量名称以取悦user257493。

EDIT1:刚刚测试过的jQuery,它有同样的问题。虽然退化很小。

4 个答案:

答案 0 :(得分:1)

我已经测试了你的代码,它似乎运行得很好。

我的结果(迭代 - >所用时间(找到div):

<强> 1。火狐:
0 - &gt; 1524(找到102)
1 - &gt; 1534(找到102)
2 - &gt; 1518(找到102)
3 - &gt; 1528(找到102)
4 - &gt; 1535(找到102)
...
15 - &gt; 1513(找到102)
16 - &gt; 1512(找到102)
17 - &gt; 1513(找到102)
18 - &gt; 1513(找到102)
19 - &gt; 1518(找到102)

<强> 2。铬:
0 - &gt; 387(找到102)
1 - &gt; 283(找到102)
2 - &gt; 268(找到102)
3 - &gt; 272(找到102)
4 - &gt; 271(找到102)
...
15 - &gt; 270(找到102)
16 - &gt; 279(找到102)
17 - &gt; 267(找到102)
18 - &gt; 287(找到102)
19 - &gt; 272(找到102)

答案 1 :(得分:0)

你的功能运行之间发生了什么? DOM如何变化?由于你的返回元素数量增加,每次连续采取的可能性有多大?此外,推进很慢。这也有效,可能会加快你的速度 - 我在重复执行中没有显示任何延迟。

function getElementsByTagName2(tagName) { 
  var arr = new Array(), 
  elems = document.getElementsByTagName(tagName); 
  for (var i = 0, len = elems.length; i != len; arr[i] = elems[i], ++i); 
  return arr; 
}

答案 2 :(得分:0)

尝试直接分配数组元素,无需推送。

function getElementsByTagName2(tag, pa){
    pa= pa || document;
    tag= pa.getElementsByTagName(tag);
    var L= tag.length, A= [];
    while(L){
        A[--L]= tag[L];
    }
    return A
}
getElementsByTagName2('*',document.body)

答案 3 :(得分:0)

Prototype to-array方法是否有同样的问题?

function $A(iterable) {
  if (!iterable) return [];
  if ('toArray' in Object(iterable)) return iterable.toArray();
  var length = iterable.length || 0, results = new Array(length);
  while (length--) results[length] = iterable[length];
  return results;
}