Род Стивенс

Книги → Delphi. Готовые алгоритмы → Глава 2. Списки

procedure CollectGarbage;

var

i, good : Longint;

begin

good : = 1; / / На это место ставится первый значащий элемент.

for i := 1 to Numltems do ’ begin

// Если элемент значащий, то он перемещается на новую позицию.

if (not (List/4 [i] =GARBAGE_VALUE) ) then

begin

if (goodoi) then

List"[good] := ListA[i];

Good := good+1; end;

end;

// Позиция, где находится последний значащий элемент.

Numltems := good-1;

end;

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

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

Этому методу присущи некоторые недостатки. Во-первых, он требует большо­го объема памяти. Если вы часто добавляете или удаляете элементы, то «мусор» заполнит большую часть массива. Такое неэкономное расходование памяти может привести к процессу подкачки, особенно если список не помещается полностью в оперативной памяти. Это будет занимать, в свою очередь, больше времени при перестройке массива.

Во-вторых, если список начинает заполняться ненужными данными, процеду­ры, использующие его, станут очень неэффективными. Если в массиве из 30 ООО элементов 25 ООО не используются, то процедуры, подобные описанной ранее про­цедуре Showltems, будут выполняться слишком медленно.

И наконец, сборка мусора в очень большом массиве может занимать значитель­ное время, особенно если сканирование массива заставляет программу обращать­ся к файлам подкачки. Это может вызвать остановку программы на несколько се­кунд, пока не очистится память.

Чтобы решить подобную проблему, достаточно создать новую переменную GarbageCount для отслеживания числа неиспользуемых элементов в списке. Ког­да не используется существенная доля памяти списка, можно начать «сборку му­сора». В следующем фрагменте кода переменная MaxGarbage сохраняет макси­мальное число неиспользуемых записей, которые может содержать список:

← предыдущая следующая →

Страницы раздела: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Публикация компанией Dropbox кода Zulip – средства общения для IT-разработчиков

20.11.2015
Одной из одобрительно встреченных программистами инициатив, реализующихся в рамках акции Hack Week, стала публикация исходного кода приложения Zulip – веб-приложения для общения между собой разработчиков в сфере IT-технологий.

Объединение ОС Android и Chrome

17.11.2015
Слухи об объединении двух крупнейших ОС компании Google, Android и Chrome, гуляют по Интернету уже более 5 лет, но до сих пор этого не случилось, хотя очевидно, что с течением времени эти ОС становятся всё более похожими: так, в последнее время появилось немало Android-устройств, к которым прилагаются клавиатуры, а Chrome OS «научилась» работать с сенсорными экранами.

Конференция Linux Piter 2015

15.11.2015
Уже почти через неделю в Санкт-Петербурге впервые в истории пройдёт конференция, посвящённая проблемам свободного программного обеспечения – Linux Piter 2015.