Заметил, что у меня очень долго выполняется очистка памяти от ненужных объектов.
Оказалось, что присваивание null
, выполняя примерно ту же функцию очистки памяти что и delete
, работает быстрее, в зависимости от браузера:
- IE6 — примерно в десять раз,
- IE8 — примерно в четыре раза,
- Firefox 3 — примерно вдвое,
- Opera — примерно на 10-20%.
Разница между delete
и присваиванием null
в том, что, во-первых, после delete
значение становится undefined
, во-вторых, удаляется не только значение, но и ключ, таким образом, исчезая из циклов вида for in
, в отличие от присваивания null
.
Если вышеперечисленное не играет роли, то можно смело пользоваться присваиванием null
вместо delete
.
6 комментариев:
delete ещё возвращает результат операции (true/false). Знал, что null быстрее, но не думал, что настолько. Видимо, тоже передётся переписать очистку объектов.
А расскажи поподробнее, в каких ситуациях требуется вручную делать очистку памяти от ненужных объектов?
Ну когда у тебя приложение должно работать без перезагрузки, и в процессе своей работы создает какие-то объекты, которые по истечение какого-то времени или каких-то событий становятся ненужными. Если не будешь очищать ссылки на такие объекты, использование памяти браузером будет неумолимо возрастать :)
У меня есть предположение почему так получается:
Конструкцией delete ты принудительно удаляешь значение из памяти, а установкой null -- ты разрываешь циклическую ссылку, для того чтобы garbage collector сам в следующей итерации нормально почистил память.
Поэтому быстрее получается.
Вроде бы такое нужно делать только для IE, так как только там DOM сделан через COM, и garbage collector работает для них через reference counter
Ну, тем не менее, в FF тоже разница есть. Хотя, конечно, все это становится заметным ну на очень больших количествах объектов.
Одна особенность, когда надо использовать delete, а не null - очистка скриптов при jsonp-запросах. Если только обнулять, то сборщик мусора вообще не чистить их.
См. http://neil.fraser.name/news/2009/07/27/
Отправить комментарий