Какая функция для добавления одного к каждому элементу списка быстрее? - PullRequest
0 голосов
/ 04 мая 2018

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

;?lon = list of numbers
(deffunction add-one-to-list-of-numbers (?lon)
    (progn$ (?field ?lon)
        (bind ?lon (replace$ ?lon ?field-index ?field-index (+ ?field 1)))
    )
    (return ?lon)
)

Функция 2:

;?lon = list of numbers
;?cnt = counter
(deffunction add-one-to-list-of-numbers-alt (?lon)
    (loop-for-count (?cnt (length ?lon))
        (bind ?lon (replace$ ?lon ?cnt ?cnt (+(nth$ ?cnt ?lon) 1)))
    )
    (return ?lon) 
)

1 Ответ

0 голосов
/ 07 мая 2018

Я бы предложил проверить эмпирически:

         CLIPS (6.31 2/3/18)
CLIPS> 
(deffunction add-one-to-list-of-numbers-1 (?lon)
   (progn$ (?field ?lon)
      (bind ?lon (replace$ ?lon ?field-index ?field-index (+ ?field 1))))
   (return ?lon))
CLIPS> 
(deffunction add-one-to-list-of-numbers-2 (?lon)
   (loop-for-count (?cnt (length$ ?lon))
      (bind ?lon (replace$ ?lon ?cnt ?cnt (+(nth$ ?cnt ?lon) 1))))
   (return ?lon))
CLIPS> 
(deffunction add-one-to-list-of-numbers-3 (?lon)
   (bind ?rv (create$))
   (progn$ (?field ?lon)
      (bind ?rv (create$ ?rv (+ ?field 1))))
   ?rv)
CLIPS> 
(timer (bind ?numbers (create$ 1 2 3 4 5 6 7 8 9))
       (loop-for-count 1000000 (add-one-to-list-of-numbers-1 ?numbers)))
7.51635100000021
CLIPS> (release-mem)
13499
CLIPS> 
(timer (bind ?numbers (create$ 1 2 3 4 5 6 7 8 9))
       (loop-for-count 1000000 (add-one-to-list-of-numbers-2 ?numbers)))
9.28229099999953
CLIPS> (release-mem)
3771
CLIPS>    
(timer (bind ?numbers (create$ 1 2 3 4 5 6 7 8 9))
       (loop-for-count 1000000 (add-one-to-list-of-numbers-3 ?numbers)))
6.42367899999954
CLIPS> 
...