Javascript: таинственное отставание от нескольких прогонов функций - PullRequest
0 голосов
/ 08 июля 2010

Следующая функция просто возвращает элемент с указанным тэгом в документе.По какой-то причине при последовательных вызовах функции ее выполнение становится все медленнее и медленнее. Я тщательно проверил ее и строку for-loop в причине, но я не понимаю, почему это приведет к замедлению последовательных вызовов.

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.

РЕДАКТИРОВАТЬ1: только что протестировал jQuery, и он имеет ту же проблему.Хотя деградация незначительна.

Ответы [ 4 ]

1 голос
/ 08 июля 2010

Я проверил Ваш код, и он, кажется, работает нормально.

Мои результаты (итерация -> время, затраченное на поиск (найденных делений):

1. Firefox: 0 -> 1524 (найдено 102)1 -> 1534 (найдено 102)2 -> 1518 (найдено 102)3 -> 1528 (найдено 102)4 -> 1535 (найдено 102)...15 -> 1513 (найдено 102)16 -> 1512 (найдено 102)17 -> 1513 (найдено 102)18 -> 1513 (найдено 102)19 -> 1518 (найдено 102)

2.Хром: 0 -> 387 (найдено 102)1 -> 283 (найдено 102)2 -> 268 (найдено 102)3 -> 272 (найдено 102)4 -> 271 (найдено 102)...15 -> 270 (найдено 102)16 -> 279 (найдено 102)17 -> 267 (найдено 102)18 -> 287 (найдено 102)19 -> 272 (найдено 102)

0 голосов
/ 08 июля 2010

Есть ли у метода 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;
}
0 голосов
/ 08 июля 2010

Попробуйте назначить элементы массива напрямую, без push.

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)
0 голосов
/ 08 июля 2010

Что происходит между запусками вашей функции? Как меняется 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; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...