Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чистить ли коллекцию или заменить? clear() vs new 
:(
    Опции темы
COVD
Дата 11.1.2008, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Если надо почистить коллекцию, что лучше - вызвать метод clear() или заменить новой пустой? Замена на новую выглядит предпочтительнее в смысле потокобезопасности. А метод clear(), который ставит null всем элементам коллекции, наверное лучше в смысле уборки мусора. 
PM MAIL   Вверх
powerOn
Дата 11.1.2008, 22:17 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Думаю, что это от конкретной ситуации зависит. 
Например, не всегда есть возможность заменить объект-коллекцию на новый. Если она объявлена как final, то в ходу только clear(). 
Так же, осмелюсь предположить, что замена коллекции на новую, будет работать быстрее, чем очистка методом clear() . Поскольку при очистке нужно выставить в null большое количество элементов. Поэтому, если коллекция велика, то лучше заменить её на новую. Если не очень велика или время очистки не критично, то подойдёт и clear().

Это сообщение отредактировал(а) powerOn - 11.1.2008, 22:18


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Stampede
Дата 11.1.2008, 22:34 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 24
Всего: 144



COVD, правило большого пальца тут такое:

Если коллекция никому не нужна, бросаем ее и создаем новую. Сборщик мусора со временм подхватит ее и оприходует.

Если имеются другие объекты, которые содержат ссылку именно на эту коллекцию, то особых выборов не остается: надо зачищать ту что есть.

Например, если в пользовательской сессии хранится объект типа Покупательская Корзинка, а в нем - список выбранных товаров, то по нажатию на кнопку Очистить корзину, естественно, лучше очистить существующий экземпляр списка, потому что он может быть связан с кучей других объектов модели данных.

А вот если мы заводим какой-то служебный список при реализации некоего алгоритма, и его область видимости сугубо локальная, то проще при каждой итерации инициализировать списковую переменную девственно новым списком, чем затирать и переиспользовать старый.

Вот так вот примерно smile



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
w1nd
Дата 11.1.2008, 22:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Цитата(Stampede @  11.1.2008,  22:34 Найти цитируемый пост)
Если коллекция никому не нужна, бросаем ее и создаем новую. Сборщик мусора со временм подхватит ее и оприходует.

Но если её предварительно почистить, то сборщику действительно будет значительно легче.


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Stampede
Дата 11.1.2008, 23:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 24
Всего: 144



Цитата(w1nd @  11.1.2008,  12:54 Найти цитируемый пост)
Но если её предварительно почистить, то сборщику действительно будет значительно легче. 


Вообще-то я всегда считал, что главная идея со сборщиком мусора заключалась в том, чтобы легче было мне, а не ему smile

Если продолжать следовать вашей логике, можно из жалости к ресурсам отказаться от механизма исключений и вернуться к повальной практике анализа кода возврата. Но можно пойти и еще дальше! Компилятор, вот не кого не распространилось еще наше милосердие! Облегчим ему работу, сократив имена переменных и функций до однобуквенных!

smile

Шютка, в которой, сами знаете...



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
COVD
Дата 11.1.2008, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Я имел в виду буферы, в которые один поток кладет данные, а другой их все забирает. Но иногда их надо чистить третьим потоком, потому что меняются условия работы. Замена на новую мне нравится тем, что если по недосмотру другой поток что-то все еще делает в буфере, то он спокойно закончит свое дело. Перестраховка. Но вот кому быстрее ее удастся почистить - моему коду или gc? Ведь наверное gc тоже будет сначала ее чистить путем установки в null всех элементов? Действительно ли я значительно облегчу ему работу? Может он это сделает эффективнее? Одно очевидно, что чем раньше "отвязать" от коллекции содержимое, если оно подлежит уборке, тем лучше. А если содержимое не подлежит уборке? Наверное, это уже философия. 

Цитата

Компилятор, вот не кого не распространилось еще наше милосердие! Облегчим ему работу, сократив имена переменных и функций до однобуквенных!


 smile  Но если можно помочь, разве трудно? Беда в том, что не очевидно, помогаешь или вредишь. В этом смысле клиентские приложения более чувствительны. На сервере взял и увеличил память, добавил мозгов. А клиенты все разные.


Это сообщение отредактировал(а) COVD - 11.1.2008, 23:26
PM MAIL   Вверх
w1nd
Дата 11.1.2008, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Цитата(Stampede @  11.1.2008,  23:12 Найти цитируемый пост)
Шютка, в которой, сами знаете...

Шютки шютками, а неприятный опыт имеется. Хотя вы, конечно, правы. Но здесь ситуация примерно та же, что и с пулами объектов - sun'овцы призывают не делать ничего подобного (говоря о том, что когда-нибудь операция new не будет так тормозить, а сборщик обретёт ИИ smile), но... 


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
COVD
Дата 11.1.2008, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Цитата

sun'овцы призывают не делать ничего подобного 


Да, "ни в чем себе не отказывайте", gc справится. Однако когда апплетовцев спросили как же быть, ведь нельзя для апплета указать необходимую память (-Xmx, -Xms), то ответом был призыв к экономии. 
PM MAIL   Вверх
batigoal
Дата 12.1.2008, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



По моему опыту общения с ребятами из Sun'а - они отчаянно призывают не делать (почти) ничего для облегчения работы gc. Утверждают, что он всегда лучше справится сам.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0526 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.