22 июн. 2009 г.

Delete vs null

Заметил, что у меня очень долго выполняется очистка памяти от ненужных объектов.

Оказалось, что присваивание null, выполняя примерно ту же функцию очистки памяти что и delete, работает быстрее, в зависимости от браузера:

  • IE6 — примерно в десять раз,
  • IE8 — примерно в четыре раза,
  • Firefox 3 — примерно вдвое,
  • Opera — примерно на 10-20%.

Разница между delete и присваиванием null в том, что, во-первых, после delete значение становится undefined, во-вторых, удаляется не только значение, но и ключ, таким образом, исчезая из циклов вида for in, в отличие от присваивания null.

Если вышеперечисленное не играет роли, то можно смело пользоваться присваиванием null вместо delete.

6 комментариев:

Azat Razetdinov комментирует...

delete ещё возвращает результат операции (true/false). Знал, что null быстрее, но не думал, что настолько. Видимо, тоже передётся переписать очистку объектов.

Степан Резников комментирует...

А расскажи поподробнее, в каких ситуациях требуется вручную делать очистку памяти от ненужных объектов?

alpha комментирует...

Ну когда у тебя приложение должно работать без перезагрузки, и в процессе своей работы создает какие-то объекты, которые по истечение какого-то времени или каких-то событий становятся ненужными. Если не будешь очищать ссылки на такие объекты, использование памяти браузером будет неумолимо возрастать :)

remha комментирует...

У меня есть предположение почему так получается:
Конструкцией delete ты принудительно удаляешь значение из памяти, а установкой null -- ты разрываешь циклическую ссылку, для того чтобы garbage collector сам в следующей итерации нормально почистил память.

Поэтому быстрее получается.
Вроде бы такое нужно делать только для IE, так как только там DOM сделан через COM, и garbage collector работает для них через reference counter

alpha комментирует...

Ну, тем не менее, в FF тоже разница есть. Хотя, конечно, все это становится заметным ну на очень больших количествах объектов.

Leechy комментирует...

Одна особенность, когда надо использовать delete, а не null - очистка скриптов при jsonp-запросах. Если только обнулять, то сборщик мусора вообще не чистить их.

См. http://neil.fraser.name/news/2009/07/27/