Уборка мусора после вычислений в 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д