| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > JavaScript: Общие вопросы > innerHTML или createElement? |
| Автор: Ghirik 28.5.2008, 04:49 | ||
| Собрался оптимизировать один свой старый скриптик под новую задачу, но оказалось, что всё написано не так... И как всегда, проще написать заново. Но раз уж заново, значит и подойти к вопросу следует обтсоятельно. Подошел... Загрузился вопросом о самом быстром создании элементов - innerHTML или createElement? http://door-to.ru/scripts/tests/testSpeedCreationElement.htm (осторожней с Мозиллой, открывайте отдельным процессом.) Ну, и код...
Над кодом не смеяться! Лепил как попало.... Скорость Оперы поражает воображение.... Mozilla, при создании через createElement, как то, хитровы...ано выдает результат... У меня старенький P4 3GHz, дак Mozilla, на первое нажатие кнопки "createElement" визуально значительно медленнее срабатывает чем IE, но время показывает всего раза в полтора большее. А если нажимаю второй раз, то уходит на долго в штопор... но после выхода, время опять то-же! |
| Автор: Ghirik 28.5.2008, 06:02 |
| Ну, собственно, этого и следовало ожидать. innerHTML - обычная строка, и, разумеется, браузеры тратят неимоверное количество ресурсов, чтобы распарсить в ней каждый элемент. Но почему бы это не сделать один раз, а потом (в цикле) при совпадении строковых значений просто создавать элементы по старой схеме. Ан нет... парсится каждый вывод innerHTML. |
| Автор: bars80080 28.5.2008, 09:08 |
| значит, однозначно заниматься креатэлементизмом? |
| Автор: SelenIT 28.5.2008, 12:49 |
| innerHTML несколько быстрее (особенно в IE), но, насколько мне известно, сбрасывает некоторые изменения DOM (напр. значения и состояния динамически добавленных элементов форм), поэтому для высокодинамичных страниц может привести к непредсказуемым последствиям. DOM-методы в общем случае медленее, зато надежнее. |
| Автор: bars80080 28.5.2008, 13:33 |
| хм, а мне показалось, что Ghirik говорит о том что inner наоборот тяжеле переваривается браузерами (больше ресурсов != больше времени ?) у меня просто есть ситуация, где я генерирую много таблиц из данных средствами DOM, а часть innerHTML (вложенные слои) нужно ли полностью переводить на DOM? |
| Автор: SelenIT 28.5.2008, 15:47 |
Если кроме этого навороченной динамики на странице нет, лично я бы оставил innerHTML. Как раз в случае таблиц разница в скорости http://www.quirksmode.org/dom/innerhtml.html. |
| Автор: bars80080 28.5.2008, 16:11 |
| страх какой, пошла идея прахом... впрочем доведу и выложу, там отладим как лучше |
| Автор: Ghirik 28.5.2008, 22:35 | ||
Ну, не совсем... Я то ж, всё анимацией занимаюсь, потому для меня результат остался результатом. Ужас... |
| Автор: IDVsbruck 29.5.2008, 15:36 |
| Я тоже давно перешел на DOM - это грамотнее и быстрее (в работе). Единственное - из-за величин проектов не всегда хочется уделять столько времени созданию структуры, проще всунуть все в innerHTML. Иногда и вовсе без DOM не обойтись ... особенно в динамических проектах. А иногда вывод возможен только через innerHTML - например, вывод кусков страницы, полученных по ajax'у - иначе можно задолбаться самому парсить код или, что еще утомительней - создавать структуру на сервере, которую сможет обрабатывать клиент. Так что вопрос удобства остается на совести каждого, но скорость почти (!) всегда за DOM'ом. Почти - это потому, что td_element.innerHTML = "aaa" будет быстрее, чем td.element.insertAdjacentText("afterEnd", "aaa") или что-то типа var aaa = "aaa"; td_element.appendChild(aaa). |
| Автор: Itsys 30.5.2008, 15:00 |
| IE 7 Time of generation createElement 125 milliseconds Time of generation innerHTML 57437 milliseconds |
| Автор: bars80080 30.5.2008, 15:21 |
| Itsys, таблицы? или это не тест, а откудато взято? |
| Автор: SelenIT 30.5.2008, 15:32 |
| Это, похоже, результат теста Ghirikа из первого поста на какой-то достаточно слабой машине. Никто не спорит, множественное изменение innerHTML в цикле - жестокий крэш-тест для браузера, это, имхо очевидно. Сравнивать есть смысл два следующих подхода - непосредственная работа с DOM (createElement+appendChild etc.) vs. генерация общего кода нужной разметки в виде строки и однократное внедрение ее в нужное место через innerHTML. Именно к этому сравнению относятся тест http://www.quirksmode.org/dom/innerhtml.html и мои комменты здесь |
| Автор: JSman 7.6.2008, 16:02 | ||
тест написан совершенно неверно, так как 1. document.getElementById('td') - каждый раз вызываем поиск элемента с указанными id 2. while (i--) { document.getElementById('td').innerHTML += "<div style='border: 1px solid #0000FF; width: 0px; height: " + i + "px; float: left;' id='div'" + i + " onclick='qwe()'></div>"; } используется контактация строк, причем неоптимизированная. |
| Автор: Ghirik 7.6.2008, 16:32 | ||||||
Понятное дело, всё на скорую руку...
Ну и что? Количество вызовов метода везде одинаковое. Как это может повлиять на достоверность относительных величин?
Не знаком с этим понятием, хоть и использовал. |
| Автор: JSman 8.6.2008, 21:30 |
| Если мы хотим сравнить быстродействие 2 возможностей, то должны снизить влияние иных методов на результат. поэтому из цикла должны убрать поиск по id. Каждый раз этот метод инициализируется и затрачивает время. действительно, что он вызывается равное количество раз в обоих случаях. Ну, это ладно. На результаты теста сильно влияет контактация строк - сложение фрагментов строки в целое. В Js эта операция совершенно не оптимизирована. Как это исправить: имеем 2 строки: a + b. получим гораздо быстрее результат, если сделаем так: [a,b].join(''). то есть используем только push и join вместо привычного +. почитайте ppk. innerHTML имеет сеттер. зачем его каждый раз вызывать, если достаточно одного раза присваиванием одной строки к innerHTML |
| Автор: Ghirik 8.6.2008, 23:34 | ||||
Ну, это понятно, SelenIT это же писал:
Но меня интересовал именно процесс последовательного вывода созданных элементов, а не скоповое внесение заранее созданного. Я рассматривал эти методы создания применительно к анимациооным процессам. Приведенная SelenIT http://www.quirksmode.org/dom/innerhtml.html показала, что применение innerHTML для разового внесения, действительно предподчтительнее. А через join array просто супер. |
| Автор: SelenIT 9.6.2008, 02:28 |
может, все-таки http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D0%BA%D0%B0%D1%82%D0%B5%D0%BD%D0%B0%D1%86%D0%B8%D1%8F? |
| Автор: babe 9.6.2008, 09:19 |
| контактация - видимо конкатенация (слияние) |