Есть ли разница между этими макросами? - Lisp

Узнай цену своей работы

Формулировка задачи:

Есть ли какая то разница между этими макросами (В производительности и в коде в который они разворачиваются)? Или же нет. Если говорить о loop или do, то там намного больше разных конструкций, и они более универсальны в плане циклов(все таки встроенные мини-языки циклов ).
(dolist (i lst) (do-something i))
 
(loop for i in lst do (do-something i))

Решение задачи: «Есть ли разница между этими макросами?»

textual
Листинг программы
INSOMNIA> (progn
            (pprint "Loop")
            (time (loop 
                     repeat 1000
                     do (loop for a in *1000000*)))
            (pprint "Dolist")
            (time (loop 
                     repeat 1000 
                     do (dolist (a *1000000*) (declare (ignore a))))))
 
"Loop"
Evaluation took:
  2.840 seconds of real time
  2.788000 seconds of total run time (2.788000 user, 0.000000 system)
  98.17% CPU
  6,799,001,607 processor cycles
  32,992 bytes consed
  
 
"Dolist"
Evaluation took:
  2.846 seconds of real time
  2.794000 seconds of total run time (2.794000 user, 0.000000 system)
  98.17% CPU
  6,811,839,198 processor cycles
  33,136 bytes consed
  
NIL

Объяснение кода листинга программы

Код выполняет две операции: первая - это прогон цикла Loop 1000 раз с использованием списка 1000000 в качестве исходных данных, а затем выводит результат. Вторая операция - это прогон цикла Dolist 1000 раз с использованием списка 1000000 в качестве исходных данных, а затем выводит результат. Вот список, описывающий действия:

  1. (progn (pprint Loop) (time (loop repeat 1000 do (loop for a in 1000000))) (pprint Dolist) (time (loop repeat 1000 do (dolist (a 1000000) (declare (ignore a))))))
  2. Loop
    • Оценка заняла: 2.840 секунд реального времени
    • Оценка заняла: 2.788000 секунд общего времени выполнения (2.788000 пользователя, 0.000000 системы)
    • 98.17% CPU
    • 6,799,001,607 циклов процессора
    • 32,992 байт сконсенде
  3. Dolist
    • Оценка заняла: 2.846 секунд реального времени
    • Оценка заняла: 2.794000 секунд общего времени выполнения (2.794000 пользователя, 0.000000 системы)
    • 98.17% CPU
    • 6,811,839,198 циклов процессора
    • 33,136 байт сконсенде
  4. NIL

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

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