Большое время выполнения
Здравствуйте. Имеется такой код:
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() |
Классический недочет. Изменение innerHTML - дорогая операция. Не нужно в цикле менять innerHTML, нужно накапливать все в переменной, и затем после цикла уже добавлять ее значение в innerHTML. Может вас заинтересует метод insertAdjacentHTML
|
danik.js, опытным путем проверено, что innerHTML выполняется быстро (1-2 мс).
Также выяснил, что очень много времени занимает первое обращение к rsCpu (порядка 95% от всего времени выполнения цикла for) Что делать в этой ситуации? Таких обращений к таблицам windows в коде 2, а весь код выполняется каждую секунду |
Цитата:
Кстати да, что-то я упустил что count всего 7. При таких малых циклах не должно быть проблем из-за innerHTML, однако лучше все-таки сделать как я написал |
К слову innerHTML не так уж и быстр. К примеру если в элементе innerHTML равен содержимому этой страницы. То 10 итераций с непосредственным изменением innerHTML занимает 150мс. Это хром, самый быстрый браузер, и не слижком слабый комп (Intel Core i5M)
|
Часовой пояс GMT +3, время: 00:29. |