Уборка мусора после вычислений в 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 выполняется следующая последовательность действий:

  1. Определяется функция с именем test, которая принимает один аргумент c.
  2. В теле функции создается прокси-процесс prog, который выполняет следующую последовательность команд.
  3. В команде setq устанавливаются значения переменных w и h равными 400.
  4. Командой grwCreate создается графический объект s со стилем Случайные точки и цветом WHITE.
  5. Командой grwShow отображается графический объект s.
  6. С помощью цикла dotimes с параметрами c, t и шагом 1000 выполняется 1000 итераций.
  7. В каждой итерации цикла проверяется, является ли счетчик i кратным 1000.
  8. Если условие истинно, то выводится сообщение Рисую... с частотой 1000 Герц.
  9. После каждой итерации цикла выполняется команда gc, которая выполняет сборку мусора.
  10. В каждой итерации цикла устанавливаются значения переменных x и y равными случайным числам в диапазоне от 0 до w и от 0 до h соответственно.
  11. Командой grwPset графическому объекту s устанавливается точка с координатами x, y и цветом BLACK.
  12. По завершению цикла командой phide скрываются все графические объекты.
  13. С помощью команды sleep* на 5 секунд приостанавливается выполнение программы.
  14. Командой grwHide скрывается графический объект s.
  15. Командой grwDestroy уничтожается графический объект s.
  16. Функция test возвращает значение nil.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.583 из 5
Похожие ответы