Уборка мусора после вычислений в HomeLisp
Формулировка задачи:
После запуска программы рисования случайных точек для параметра >=20000 сборка мусора занимает заметное время. Что в программе приводит к такому расходу памяти?
Можно ли как-нибудь её переделать так, чтобы она меньше мусорила?
(defun test(c)
(prog (i w h x y)
(setq w 400)
(setq h 400)
(grwCreate 's w h "Случайные точки" _WHITE)
(grwShow 's)
(dotimes (i c t)
(pshow (* 100. (/ i c)) "Рисую...")
(setq x (RND w))
(setq y (RND h))
(grwPset 's x y _BLACK)
)
(phide)
(sleep* 5000)
(grwHide 's)
(grwDestroy 's)
)
)Решение задачи: «Уборка мусора после вычислений в HomeLisp»
textual
Листинг программы
(defun test(c) (prog (i w h x y) (setq w 400) (setq h 400) (grwCreate 's w h "Случайные точки" _WHITE) (grwShow 's) (dotimes (i c t) (when (zerop (% i 1000))(pshow (* 100. (/ i c)) "Рисую...") (gc)) (setq x (RND w)) (setq y (RND h)) (grwPset 's x y _BLACK) ) (phide) (sleep* 5000) (grwHide 's) (grwDestroy 's)))
Объяснение кода листинга программы
В данном коде на языке Lisp выполняется следующая последовательность действий:
- Определяется функция с именем
test, которая принимает один аргументc. - В теле функции создается прокси-процесс
prog, который выполняет следующую последовательность команд. - В команде
setqустанавливаются значения переменныхwиhравными 400. - Командой
grwCreateсоздается графический объектsсо стилемСлучайные точкии цветом WHITE. - Командой
grwShowотображается графический объектs. - С помощью цикла
dotimesс параметрамиc,tи шагом 1000 выполняется 1000 итераций. - В каждой итерации цикла проверяется, является ли счетчик
iкратным 1000. - Если условие истинно, то выводится сообщение
Рисую...с частотой 1000 Герц. - После каждой итерации цикла выполняется команда
gc, которая выполняет сборку мусора. - В каждой итерации цикла устанавливаются значения переменных
xиyравными случайным числам в диапазоне от 0 доwи от 0 доhсоответственно. - Командой
grwPsetграфическому объектуsустанавливается точка с координатамиx,yи цветом BLACK. - По завершению цикла командой
phideскрываются все графические объекты. - С помощью команды
sleep*на 5 секунд приостанавливается выполнение программы. - Командой
grwHideскрывается графический объектs. - Командой
grwDestroyуничтожается графический объектs. - Функция
testвозвращает значениеnil.