Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Большое время выполнения (https://javascript.ru/forum/misc/36135-bolshoe-vremya-vypolneniya.html)

RogerUP 04.03.2013 23:44

Большое время выполнения
 
Здравствуйте. Имеется такой код:
rsCpu = oService.ExecQuery("SELECT PercentProcessorTime FROM Win32_PerfFormattedData_PerfOS_Processor");
  for (i=0; i<rsCpu.count; i++)
    cpuDiv.innerHTML += '<div style="top:' + (i*15+15) + 'px; left:3px;">Core' + (i==6?' All':i) + ': ' + rsCpu.ItemIndex(i).PercentProcessorTime + '</div>';

Выполнение ExecQuery занимает около 1 мс, а цикла for около 300 мс (при rsCpu.count = 7), хотя добавление к innerHTML, добавление i и сравнение i<rsCpu.count занимает 1-3 мс. Куда может уходить остальное время?
Время замерял с помощью
new Date().getMilliseconds()

danik.js 05.03.2013 04:54

Классический недочет. Изменение innerHTML - дорогая операция. Не нужно в цикле менять innerHTML, нужно накапливать все в переменной, и затем после цикла уже добавлять ее значение в innerHTML. Может вас заинтересует метод insertAdjacentHTML

RogerUP 05.03.2013 14:00

danik.js, опытным путем проверено, что innerHTML выполняется быстро (1-2 мс).
Также выяснил, что очень много времени занимает первое обращение к rsCpu (порядка 95% от всего времени выполнения цикла for)
Что делать в этой ситуации? Таких обращений к таблицам windows в коде 2, а весь код выполняется каждую секунду

danik.js 05.03.2013 14:07

Цитата:

Сообщение от RogerUP
Что делать в этой ситуации?

Профилировать код.
Кстати да, что-то я упустил что count всего 7. При таких малых циклах не должно быть проблем из-за innerHTML, однако лучше все-таки сделать как я написал

danik.js 05.03.2013 14:13

К слову innerHTML не так уж и быстр. К примеру если в элементе innerHTML равен содержимому этой страницы. То 10 итераций с непосредственным изменением innerHTML занимает 150мс. Это хром, самый быстрый браузер, и не слижком слабый комп (Intel Core i5M)


Часовой пояс GMT +3, время: 00:29.