2016-10-18 2 views
0

Я попытался выяснить, что отличает между двумя версиями небольшого фрагмента кода в исполнении. Не пытайтесь понять, для чего это. Это окончательный код после удаления всего остального, чтобы найти проблему с производительностью.javascript performance for Array

function test(){ 
    var start=new Date(), times=100000; 
    var l=["a","a"]; 
    for(var j=0;j<times;j++){ 
     var result=document.getElementsByTagName(l[0]), rl=result.length; 
     for(var i=0;i<rl;i++){ 
      l[0]=result[i]; 
     } 
    } 
    var end=new Date(); 
    return "by=" + (end-start); 
} 

Для меня это сниппеты принимает 236ms в Firefox, но если изменить l[0]=result[i]; к l[1]=result[i]; он принимает только 51ms. То же самое произойдет, если я изменю document.getElementsByTagName(l[0]) на document.getElementsByTagName(l[1]). И если оба изменения, то сниппет снова будет медленным.

После использования Google Chrome с DevTools/Profiles я вижу, что при выполнении медленного кода добавляется функция toString. Но у меня нет шансов получить, какой toString это и почему это необходимо в этом случае.

Не могли бы вы рассказать мне, в чем разница для браузера, так что это займет в 5 раз больше, чем другое?

Благодаря

+3

Так что, если вы измените функциональность на что-то совершенно другое или получите совершенно другой элемент, это займет другое время. Кто бы мог подумать ? – adeneo

+0

Нет, это так, кажется, нет ничего другого, поскольку l [0] и l [1] оба являются «а». –

+0

'Не пытайтесь понять. Это немного затрудняет нам помощь ... :), но почему вы хотите, чтобы результат dom list в getElementsByTagName был на моей голове. – Keith

ответ

0

В коде выше вы используете l[0] для поиска элемента. Затем вы меняете l[0] и снова ищите снова и так далее. Если теперь вы измените одно из двух видов использования (не оба!) До l[1], вы не измените то, что ищете, что повышает производительность.

Именно поэтому, когда вы меняете оба, это медленно.

1

Если вы меняете только один из индексов на 0 или 1, код больше не делает то же самое. Если вы измените оба индекса, производительность останется идентичной.

При использовании же индекс для чтения и записи, что происходит в том, что значение, которое хранится в l[0] используется в следующем вызове getElementsByTagName, который должен назвать toString на нем.