Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление объектов 
:(
    Опции темы
Domestic Cat
Дата 27.2.2005, 07:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 9
Всего: 172



Нашел я как делать.
1. Запускаем perfmon.exe из Выполнить.
2. Кликаем правой кнопкой на правой панели и выбираем "Добавить счетчики..."
3. Выбираем объект Память CLR .NET и Выбрать все счетчики
4. Нажимаем Добавить и Закрыть
5. Запускаем ченить НЕТовское и смотрим, лучше под видом "Просмотр отчета".



--------------------

PM   Вверх
Freeman
Дата 27.2.2005, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



to Дрон
Проблема в том, что удаление не работает так как должно.
PM MAIL   Вверх
Domestic Cat
Дата 27.2.2005, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 9
Всего: 172



Цитата(Freeman @ 26.2.2005, 23:57)
Проблема в том, что удаление не работает так как должно.


Все на самом деле работает. Если не веришь - вот пример:
Код

class Class1
{
 static ArrayList list = new ArrayList();
 /// <summary>
 /// The main entry point for the application.
 /// </summary>
 
 [STAThread]
 static void Main(string[] args)
 {
  long totalMemory = GC.GetTotalMemory(true);
  Console.WriteLine("Was: " + totalMemory);
  FillList();
  totalMemory = GC.GetTotalMemory(true);
  Console.WriteLine("Before removing: " + totalMemory);
  RemoveAllFromList();
  totalMemory = GC.GetTotalMemory(true);
  Console.WriteLine("After removing: " + totalMemory);
 }

 private static void FillList()
 {
  for (int i = 0; i < 1000; i++)
   list.Add(new Object());
 }

 private static void RemoveAllFromList()
 {
  for (int i = 1000; i > 0; i--)
   list.RemoveAt(0);
 }
}


Результат:
Цитата
Was: 45116
Before removing: 64200
After removing: 52200


64200 - 52200 = 12000 байт
Всего объектов 1000 - значит, по 12 байт на каждый Объект, как и должно быть. То есть, все объекты после метода RemoveAllFromList были вычищены.


--------------------

PM   Вверх
Freeman
Дата 27.2.2005, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



to Domestic Cat
Я не спорю с ArrayList все работает, но я не думаю что в реальном приложении Вы будете пользоваться таким списком. По-крайней мере из-за двух причин :
1. Слишком медленный(в части удаления), запустите Ваш пример не на 1000, а на 100000 и больше.
2. Расход памяти одинаковый для любых объектов, и равен <размер списка>*sizeof(Object), что наводит на мысль что в ArrayList хранятся не сами объекты, а лишь ссылки на них, причем ссылки типа Object, из-за этого возникает дополнительная трудоемкость, более того если со ссылочными типами происходит только преобразование типа, то со структурными типами происходит упаковка объекта, что также не улучшает эффективность данной структуры.
3. Если можно, не могли бы Вы объяснить следующую вешь.
Was: 211380
Before: 1938880
After: 738868
почему разница между After - Was, такая большая?

А вот если Вы поставите в нужные места в моем незамысловатом коде следующий код
Код

memory = GC.GetTotalMemory(true);
Console.WriteLine(".....: {0}", memory);

то получатся следующие результаты
Was: 216656
Before: 1819012
After: 219012

Тестирование в обоих случаях проводилось на 100000.
PM MAIL   Вверх
Domestic Cat
Дата 27.2.2005, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 9
Всего: 172



Цитата(Freeman @ 27.2.2005, 01:44)
но я не думаю что в реальном приложении Вы будете пользоваться таким списком.


Почему не буду, буду. Свое-то точно сочинять не собираюсь.

Цитата(Freeman @ 27.2.2005, 01:44)
Слишком медленный(в части удаления), запустите Ваш пример не на 1000, а на 100000 и больше.

ArrayList по идее должен быть реализован в виде массива. Удаление действительно долго идет, но зато доступ быстрее.

Цитата(Freeman @ 27.2.2005, 01:44)
Расход памяти одинаковый для любых объектов, и равен <размер списка>*sizeof(Object), что наводит на мысль что в ArrayList хранятся не сами объекты, а лишь ссылки на них,

Само собой

Цитата(Freeman @ 27.2.2005, 01:44)
причем ссылки типа Object

Да, Объект, иначе он бы вообще ничего не смог хранить. Не устраивает - есть generics.

Цитата(Freeman @ 27.2.2005, 01:44)
ссылочными типами происходит только преобразование типа, то со структурными типами происходит упаковка объекта, что также не улучшает эффективность данной структуры.

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

Цитата(Freeman @ 27.2.2005, 01:44)
почему разница между After - Was, такая большая?

Помимо твоих объектов, нахипе создаются и другие, которые ты "не видишь". Например простейшая операция
Код

string с = "Хелло " + "Ворлд!";

создает как минимум 3 объекта.
Помимо этого, getTotalMemory не всегда выдает точное значение.


Цитата(Freeman @ 27.2.2005, 01:44)
то получатся следующие результаты
Was: 216656
Before: 1819012
After: 219012


Вроде ж все пучком, объекты удаляются, разве не так?


--------------------

PM   Вверх
Freeman
Дата 27.2.2005, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Объекты удаляются лишь виртуально, физическая память не освобождается. Это аналогично работе "Корзины" в Винде, вроде бы файлы удаляются, но место на диске все равно жрут, по не очистишь smile

Цитата
Помимо твоих объектов, нахипе создаются и другие, которые ты "не видишь".

И как я понял они не удаляются.

Список это достаточно простая структура, и она заранее реализована. Но если мне нужно допустим какое-нибудь дерево или граф, я что-то не нашел ничего подобного.
PM MAIL   Вверх
Дрон
Дата 27.2.2005, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

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



Freeman
Чегой-то я не понимаю, в чём же всё-таки у тебя проблема?
Такова уж особенность систем с автоматической сборкой мусора smile

Хочется самостоятельно управлять памятью? Так напиши на Си какую-нибудь библиотеку, сделай там функции аналогичные malloc и free, подключи в .NET и используй их (хотя это бредовая и бесполезная идея) smile


--------------------
Да. Именно так.
PM   Вверх
Freeman
Дата 1.3.2005, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Проблема была в том что удаление работало на половину, из кучи объекты удалялись, а из физической памяти нет. Но в конце концов я понял в чем была причина. Все дело было в сборщике мусора, он не работает в Visual Studio 2005 Beta 1, по крайней мере так как должен. Но у меня имеется также и 2003 там все работает прекрасно.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

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


 




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


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

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