
28.11.2008, 03:55
|
|
Аспирант
|
|
Регистрация: 20.08.2008
Сообщений: 56
|
|
|
Цитата:
|
|
И что этим кодом можно увидеть? Скачки в несколько килобайт используемой памяти, связаны с работой сборщика мусора. Не в одном браузере утечек памяти не наблюдается.
|
Именно в этом я и хотел убедится. У меня, пока тоже, аналогичный результат получился.
|
Цитата:
|
|
В памяти остаются все дочерние узлы, на которые где-либо хранятся ссылки
|
Это "особенность" наверное очень даже правильная! Раз я себе этот объект для чего-то "заначил" (читай: сохранил на него ссылку), значит мне он для чего-нибудь еще будет нужен. Следовательно удалять его можно только когда исчезнут все ссылки на него.
Другое дело, не произойдёт ли что-либо подобное, если на чилдрена есть не прямая ссылка, а подписка на событие. Мне сегодня уже лень это проверять - завтра попробую протестить.
Или если у кого-то будет еще желание этим заняться - бросьте сюда тестовый код.
|
|

28.11.2008, 04:08
|
|
Аспирант
|
|
Регистрация: 20.08.2008
Сообщений: 56
|
|
Небольшой оффтопик, с Вашего позволения...
|
Цитата:
|
|
использования кэша по идентификаторам
|
А как Вы решали проблему с тем, что структура документа в процессе работы скрипта может измениться (я имею в виду не только удаление узлов, но и добавление новых) и тот-же самый идентификатор должен вернуть уже абсолютно другие элементы.
Или Вы в этом случае запрещаете кэширование? Тогда, ИМХО, его надо будет запрещать в 90% случаев. А в оставшихся 10% эффективность кэша будет близка к нулю.
Это по крайней мере было-бы так с теми задачами, которые мне приходилось решать.
|
|

28.11.2008, 04:28
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
|
В документе не должно быть нескольких элементов с одним идентификатором. При смене идентификатора через специальную функцию, кэш очищается. Можно повесить обработчики, очищающие кэш, на специальные события, реагирующие на изменения структуры DOM, но я этого пока не делал, потому что в ИЕ нет этих событий. Повышение производительности при использование кэша существенно, поэтому стоит заморачиваться, темболее операции, требующие очистки кэша встречаются не так часто в большинстве скриптов.
|
|

28.11.2008, 19:37
|
|
Кандидат Javascript-наук
|
|
Регистрация: 21.11.2008
Сообщений: 114
|
|
Сообщение от Gvozd
|
ну, если вас так интересует этот вопрос, то составьте сркипт, с созданием больших объектов(чтоб утечка памяти на глаз была заметна), слушателячми и прочим, и последующим удалением
выложите его тут, пускай в разных протестят, и оформят здесь результаты.
а мне влом писать скрипт, я пошел спать.
всем спокойной ночи
|
Протестить можно, допустим, так:
|
Код:
|
for (var i = 0,
efn = window.addEventListener ? 'addEventListener' : 'attachEvent',
et = (window.addEventListener ? '' : 'on') + 'click',
e; i < 100000; ++i
)
(e = document.createElement('DIV'))[efn](et, function(e){ return function(){}; }(e), false); |
Лиса вначале ест память, потом, если дать ей немного остыть - отдает.
Опера-9 довольно быстро и корректно отрабатывает сборку мусора, отъем памяти почти незаметен.
Осел, ест, но, как и ожидалось, не отдает. Если убрать циклическую ссылку из замыкания (выделена жирным), то, осел вообще не ест память (либо отдает слишком быстро). Если свернуть окно осла, память освобождается, но если потом опять развернуть и еще разок прогнать цикл - достает всю кучу мусора из свопа и продолжает ее наполнять )
Сафаря-3, память отдавать не торопится - или это похожий баг, или там уборщик мусора ленивый )
Последний раз редактировалось vk65535, 02.12.2008 в 11:56.
|
|

04.12.2008, 23:58
|
 |
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
|
vk65535, Большое спасибо, за тесты
|
|
|
|