Hi,
As Michael said, logicaly repeat sould be faster than while, but it appears to me that most of the time while seems to be faster.
Anyway, a while statement speed depends on what is evaluated in the conditional expression.
Here's an example with three implementations of the classical ss2lst routine which returns a list of ename from a selection set.
The first one (ss2lst_repeat) uses repeat with the length of the selection set.
The second one (ss2lst_while1) uses while the same way as repeat evaluating a counter
The third one (ss2lst_while2) uses while in an optimised way: evaluating (ssname ss n) as condition, this have to be evaluated in every case.
I don't include foreach, neither mapcar, which only operate on lists.
(defun ss2lst_repeat (ss / n lst)
(repeat (setq n (sslength ss))
(setq lst (cons (ssname ss (setq n (1- n))) lst))
)
lst
)
(defun ss2lst_while1 (ss / n lst)
(setq n (sslength ss))
(while (< 0 n)
(setq lst (cons (ssname ss (setq n (1- n))) lst))
)
lst
)
(defun ss2lst_while2 (ss / n ent lst)
(setq n -1)
(while (setq ent (ssname ss (setq n (1+ n))))
(setq lst (cons ent lst))
)
(reverse lst)
)
_$ (sslength (setq ss (ssget)))
10000
_$ (benchmark '((ss2lst_repeat ss) (ss2lst_while1 ss) (ss2lst_while2 ss)))
Benchmarking ..........Elapsed milliseconds / relative speed for 128 iteration(s):
(SS2LST_WHILE2 SS).....1060 / 1.35 <fastest>
(SS2LST_WHILE1 SS).....1248 / 1.15
(SS2LST_REPEAT SS).....1435 / 1.00 <slowest>