Author Topic: -={Test}=- NthCdr FirstN LastN Slice Member  (Read 5730 times)

0 Members and 1 Guest are viewing this topic.

Marc'Antonio Alessi

  • Swamp Rat
  • Posts: 1451
  • Marco
-={Test}=- NthCdr FirstN LastN Slice Member
« on: February 28, 2014, 02:30:45 AM »
I'm trying some functions, such NthCdr FirstN LastN Slice, with my functions "CdXXXXr", the interesting thing is that, with very long lists (preferably containing strings), also the function "ALE_List_Member" is faster than the function "Member".
Any comments?
Code: [Select]
(setq aList '(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30))
(ALE_List_LastN    2 aList) => (29 30)
(ALE_List_FirstN   2 aList) => (1 2)
(ALE_List_NthCdr   2 aList) => (3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30)
(ALE_List_LastN   20 aList) => (11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30)
(ALE_List_FirstN  20 aList) => (1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20)
(ALE_List_NthCdr  20 aList) => (21 22 23 24 25 26 27 28 29 30)
(Ale_List_Slice 2 20 aList) => (3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21)
Code: [Select]
(defun ALE_List_Member (i l)
  (ALE_List_NthCdr (vl-position i l) l)
)
; 2014/02/19 - n (Position) Nth like
(defun ALE_List_NthCdr (n l)   
  (repeat (/       n              1000) (setq l (Cd1000r l)))   
  (repeat (/ (setq n (rem n 1000)) 100) (setq l (Cd100r  l)))   
  (repeat (/ (setq n (rem n  100))  10) (setq l (Cd10r   l)))   
  (repeat (/ (setq n (rem n   10))   4) (setq l (cddddr  l)))   
  (repeat (rem n 4)                     (setq l (cdr     l)))   
  l   
)
;
(defun Cd10r (l)
  (cddddr(cddddr(cddr l)))
)
(defun Cd100r (l)
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr l)))))))))))))))))))))))))
)
(defun Cd1000r (l)
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr(cddddr(cddddr
  (cddddr(cddddr(cddddr(cddddr(cddddr l))))))))))))
  )))))))))))))))))))))))))))))))))))))))))))))))))
  )))))))))))))))))))))))))))))))))))))))))))))))))
  )))))))))))))))))))))))))))))))))))))))))))))))))
  )))))))))))))))))))))))))))))))))))))))))))))))))
  ))))))))))))))))))))))))))))))))))))))))))
)
;
(defun ALE_List_LastN (n l)   
  (ALE_List_NthCdr (- (length l) n) l)
)
;
(defun ALE_List_FirstN (n l)   
  (reverse (ALE_List_NthCdr (- (length l) n) (reverse l)))
)
;
(defun ALE_List_Slice (n1 n2 l)
  (reverse (ALE_List_NthCdr (- (length l) n2 1) (reverse (ALE_List_NthCdr n1 l))))
)
Code: [Select]
Other versions:
; 2014/02/27 slower
(defun ALE_List_NthCdr4 (n l)   
  (cond
    ( (>   10 n) (repeat n (setq l (cdr l))) l)
    ( (>  100 n)
      (repeat (/   n  10) (setq l (Cd10r   l)))
      (repeat (rem n  10) (setq l (cdr     l))) l
    )
    ( (> 1000 n)
      (repeat (/   n 100) (setq l (Cd100r  l)))   
      (repeat (/ (setq n (rem n  100))  10) (setq l (Cd10r   l)))   
      (repeat (rem n 10)                    (setq l (cdr     l))) l   
    )
    ( (>= n (length l)) nil )
    ( T
      (repeat (/       n              1000) (setq l (Cd1000r l)))   
      (repeat (/ (setq n (rem n 1000)) 100) (setq l (Cd100r  l)))   
      (repeat (/ (setq n (rem n  100))  10) (setq l (Cd10r   l)))   
      (repeat (rem n 10)                    (setq l (cdr     l))) l
    )
  )
)
; 2014/02/27 slower
(defun ALE_List_NthCdr3 (n l / s p)   
  (cond
    ( (>   10 n) (repeat n (setq l (cdr l))) l)
    ( (>  100 n)
      (repeat (/   n  10) (setq l (Cd10r   l)))
      (repeat (rem n  10) (setq l (cdr     l))) l
    )
    ( (> 1000 n)
      (repeat (/   n 100) (setq l (Cd100r  l)))   
      (repeat (/ (setq n (rem n  100))  10) (setq l (Cd10r   l)))   
      (repeat (rem n 10)                    (setq l (cdr     l))) l   
    )
    ( (>= n (length l)) nil )
    ( T
      (setq s '(" l"))
      (repeat (/       n              1000) (setq s (cons "(Cd1000r" s) p (cons ")" p)))
      (repeat (/ (setq n (rem n 1000)) 100) (setq s (cons "(Cd100r"  s) p (cons ")" p)))
      (repeat (/ (setq n (rem n  100))  10) (setq s (cons "(Cd10r"   s) p (cons ")" p)))
      (repeat (rem     n                10) (setq s (cons "(cdr"     s) p (cons ")" p)))
      (eval (read (apply 'strcat (append s p))))
    )
  )
)

Marc'Antonio Alessi

  • Swamp Rat
  • Posts: 1451
  • Marco
Re: -={Test}=- NthCdr FirstN LastN Slice Member
« Reply #1 on: February 28, 2014, 02:51:14 AM »
Code: [Select]
(progn
  (setq aList nil Countr 0)
  (repeat 1000 (setq aList (cons (itoa (setq Countr (1+ Countr))) aList)))
  (repeat 12 (setq Alist (append Alist Alist)))
  (setq Alist (append Alist '(100)))
  (princ "\nLength: ") (princ (length aList)) (princ "\n ") (princ)
)
(Benchmark '(
(ALE_List_Member  100 Alist)
(member  100 Alist)
)           )
Code: [Select]
Length: 4096001
Elapsed milliseconds / relative speed for 4 iteration(s):
    (ALE_LIST_MEMBER 100 ALIST).....1435 / 3.8 <fastest>
    (MEMBER 100 ALIST)..............5460 / 1 <slowest>

irneb

  • Water Moccasin
  • Posts: 1794
  • ACad R9-2016, Revit Arch 6-2016
Re: -={Test}=- NthCdr FirstN LastN Slice Member
« Reply #2 on: February 28, 2014, 03:22:18 AM »
Some of them I've implemented here: http://alisp-ext.wikidot.com/autolisp

Common sense - the curse in disguise. Because if you have it, you have to live with those that don't.

Marc'Antonio Alessi

  • Swamp Rat
  • Posts: 1451
  • Marco
Re: -={Test}=- NthCdr FirstN LastN Slice Member
« Reply #3 on: February 28, 2014, 03:43:29 AM »
Some of them I've implemented here: http://alisp-ext.wikidot.com/autolisp
Thanks Irneb, I have tried many types of similar functions but my biggest surprise is this:
(ALE_LIST_MEMBER 100 ALIST).....1435 / 3.8 <fastest>
(MEMBER 100 ALIST)......................5460 / 1 <slowest>

Ciao.
Code: [Select]
(progn
  (princ "\Posit: ")
  (princ (setq posit 1000000))
  (setq aListInt nil Countr 0)
  (repeat 1000 (setq aListInt (cons (setq Countr (1+ Countr)) aListInt)))
  (repeat 10 (setq aListInt (append aListInt aListInt)))
  (princ "\nLength aListInt: ") (princ (length aListInt)) (princ "\n ") (princ)
  (setq aListStr nil Countr 0)
  (repeat 1000 (setq aListStr (cons (itoa (setq Countr (1+ Countr))) aListStr)))
  (repeat 10 (setq aListStr (append aListStr aListStr)))
  (princ "\nLength aListStr: ") (princ (length aListStr)) (princ "\n ") (princ)
)

Posit: 1000000
Length aListInt: 1024000
Length aListStr: 1024000

(Benchmark '(
(ALE_List_NthCdr posit aListInt)
(nthcdr          posit aListInt)
)           )
(ALE_LIST_NTHCDR POSIT ALISTINT).....1061 / 5.7 <fastest>
(NTHCDR POSIT ALISTINT)..............6053 / 1 <slowest>

(Benchmark '(
(ALE_List_NthCdr posit aListStr)
(nthcdr          posit aListStr)
)           )
(ALE_LIST_NTHCDR POSIT ALISTSTR).....1123 / 6.64 <fastest>
(NTHCDR POSIT ALISTSTR)..............7456 / 1 <slowest>

irneb

  • Water Moccasin
  • Posts: 1794
  • ACad R9-2016, Revit Arch 6-2016
Re: -={Test}=- NthCdr FirstN LastN Slice Member
« Reply #4 on: February 28, 2014, 04:14:42 AM »
Thanks Irneb, I have tried many types of similar functions but my biggest surprise is this:
(ALE_LIST_MEMBER 100 ALIST).....1435 / 3.8 <fastest>
(MEMBER 100 ALIST)......................5460 / 1 <slowest>
Yes, I also saw that. And have also used it in my version of NthCdr. Though I learnt it from Evgeniy (http://www.theswamp.org/index.php?topic=32428.msg380205#msg380205 ).

But I see this one takes it a bit further - 1000, 100, 10 and then the 4 and then 1. Not sure how much difference it would be as compared to my optimized version of NthCDR: http://alisp-ext.wikidot.com/auotolisp-nthcdr But I guess it might make a bit of a difference since there's less setq's happening on long lists.

It was known however that vl-position is a lot quicker on long lists than member is, so that doesn't surprise me. But I didn't know that it would be so much quicker as to allow NthCDR to happen as well and still be several times as fast. Obviously it's not much quicker on short lists though.
Common sense - the curse in disguise. Because if you have it, you have to live with those that don't.

Marc'Antonio Alessi

  • Swamp Rat
  • Posts: 1451
  • Marco
Re: -={Test}=- NthCdr FirstN LastN Slice Member
« Reply #5 on: February 28, 2014, 04:26:00 AM »
<clip>... Obviously it's not much quicker on short lists though.
It is pretty good on short lists too:
Code: [Select]
(progn
  (setq aList nil Countr 0)
  (repeat Length (setq aList (cons (itoa (setq Countr (1+ Countr))) aList)))
  (setq Alist (append Alist '(100)))
  (princ "\nLength: ") (princ (length aList)) (princ "\n ") (princ)
)

Length: 11
Elapsed milliseconds / relative speed for 4096 iteration(s):
    (ALE_LIST_MEMBER 100 ALIST).....1045 / 1.34 <fastest>
    (MEMBER 100 ALIST)..............1404 / 1 <slowest>

Length: 51
Elapsed milliseconds / relative speed for 4096 iteration(s):
    (ALE_LIST_MEMBER 100 ALIST).....1014 / 1.28 <fastest>
    (MEMBER 100 ALIST)..............1295 / 1 <slowest>

Length: 101
Elapsed milliseconds / relative speed for 8192 iteration(s):
    (MEMBER 100 ALIST)..............2106 / 1.43 <fastest>
    (ALE_LIST_MEMBER 100 ALIST).....3011 / 1 <slowest>

Length: 1001
Elapsed milliseconds / relative speed for 4096 iteration(s):
    (ALE_LIST_MEMBER 100 ALIST).....1514 / 1.41 <fastest>
    (MEMBER 100 ALIST)..............2137 / 1 <slowest>

irneb

  • Water Moccasin
  • Posts: 1794
  • ACad R9-2016, Revit Arch 6-2016
Re: -={Test}=- NthCdr FirstN LastN Slice Member
« Reply #6 on: February 28, 2014, 05:15:11 AM »
Actually those ALE functions are hugely faster when working on very long lists:
Code: [Select]
_$ (setq lst nil)
nil
_$ (length (repeat 1000 (setq lst (cons (length lst) lst))))
1000
_$ (length (repeat 10 (setq lst (append lst lst))))
1024000
_$ (quickbench '((ALE_List_NthCdr 512000 lst) (nthcdr 512000 lst)))
Benchmarking .. done for 64 iterations. Sorted from fastest.
Statement                                Increment  Time(ms) Normalize  Rating
--------------------------------------------------------------------------------
(ALE_LIST_NTHCDR 512000 LST)                    64      1871      1871      4.03
(NTHCDR 512000 LST)                             16      1887      7548      1.00
--------------------------------------------------------------------------------
_$ (quickbench '((ALE_List_NthCdr 512 lst) (nthcdr 512 lst)))
Benchmarking .. done for 8192 iterations. Sorted from fastest.
Statement                                Increment  Time(ms) Normalize  Rating
--------------------------------------------------------------------------------
(ALE_LIST_NTHCDR 512 LST)                     8192      1202      1202      1.51
(NTHCDR 512 LST)                              8192      1811      1811      1.00
--------------------------------------------------------------------------------
Common sense - the curse in disguise. Because if you have it, you have to live with those that don't.

Marc'Antonio Alessi

  • Swamp Rat
  • Posts: 1451
  • Marco
Re: -={Test}=- NthCdr FirstN LastN Slice Member
« Reply #7 on: February 28, 2014, 05:31:24 AM »
On short list when the result is similar may also vary by the position of the function to bench:
Code: [Select]
(progn
  (princ "\Posit: ")
  (princ (setq posit 99))
  (setq aListStr nil Countr 0)
  (repeat 100 (setq aListStr (cons (itoa (setq Countr (1+ Countr))) aListStr)))
  (princ "\nLength aListStr: ") (princ (length aListStr)) (princ "\n ") (princ)
)
(Benchmark '(
(ALE_List_NthCdr posit aListStr)
(nthcdr          posit aListStr)
(ALE_List_NthCdr posit aListStr)
(nthcdr          posit aListStr)
)           )
Code: [Select]
Posit: 99
Length aListStr: 100
Elapsed milliseconds / relative speed for 8192 iteration(s):

    (ALE_LIST_NTHCDR POSIT ALISTSTR).....2059 / 1.3 <fastest>
    (NTHCDR POSIT ALISTSTR)..............2652 / 1.01
    (NTHCDR POSIT ALISTSTR)..............2652 / 1.01
    (ALE_LIST_NTHCDR POSIT ALISTSTR).....2668 / 1 <slowest>

irneb

  • Water Moccasin
  • Posts: 1794
  • ACad R9-2016, Revit Arch 6-2016
Re: -={Test}=- NthCdr FirstN LastN Slice Member
« Reply #8 on: February 28, 2014, 05:42:11 AM »
BTW, here's a much simpler way of writing those power-of-10 CDR call defuns. This shouldn't affect performance, since it's only done on loading the lisp:
Code - Auto/Visual Lisp: [Select]
  1. ;;; Make cdr multiples
  2. ((lambda (/ n code)
  3.    (setq n 1)
  4.    (repeat 4
  5.      (setq code 'l)
  6.      (repeat (/ (setq n (* n 10)) 4) (setq code (cons 'cddddr (list code))))
  7.      (repeat (rem n 4) (setq code (cons 'cdr (list code))))
  8.      (eval
  9.        (cons 'defun
  10.              (cons (read (strcat "cd" (itoa n) "r"))
  11.                    (cons '(l) (list code))))))))
On my ACad 2014 on Win7-64 it will do up to CD10000R before it causes a stack overflow error - thus repeat only 4 times, on 5th I get an error, so CD100000R and above isn't possible.
Common sense - the curse in disguise. Because if you have it, you have to live with those that don't.

irneb

  • Water Moccasin
  • Posts: 1794
  • ACad R9-2016, Revit Arch 6-2016
Re: -={Test}=- NthCdr FirstN LastN Slice Member
« Reply #9 on: February 28, 2014, 06:14:19 AM »
Doing the same idea, but using powers of 2 instead of 10:
Code - Auto/Visual Lisp: [Select]
  1. ((lambda (/ n code)
  2.    (setq n 4)
  3.    (while (< n 60000)
  4.      (setq code 'l
  5.            n (* n 2))
  6.      (repeat (/ n 4) (setq code (cons 'cddddr (list code))))
  7.      (repeat (rem n 4) (setq code (cons 'cdr (list code))))
  8.      (eval
  9.        (cons 'defun
  10.              (cons (read (strcat "cd" (itoa n) "r"))
  11.                    (cons '(l) (list code))))))))
  12.  
  13. (defun nthcdr (n l /)
  14.   (repeat (/ n 65536) (setq l (cd65536r l)))
  15.   (repeat (/ (setq n (rem n 65536)) 16384) (setq l (cd16384r l)))
  16.   (repeat (/ (setq n (rem n 16384)) 1024) (setq l (cd1024r l)))
  17.   (repeat (/ (setq n (rem n 1024)) 128) (setq l (cd128r l)))
  18.   (repeat (/ (setq n (rem n 128)) 16) (setq l (cd16r l)))
  19.   (repeat (/ (setq n (rem n 16)) 4) (setq l (cddddr l)))
  20.   (repeat (rem n 4) (setq l (cdr l)))
  21.   l)
Only "slightly" faster on very long lists (14% over 500k).
Code: [Select]
Benchmarking .. done for 64 iterations. Sorted from fastest.
Statement                                Increment  Time(ms) Normalize  Rating
--------------------------------------------------------------------------------
(NTHCDR 512000 LST)                            64      1622      1622      1.14
(ALE_LIST_NTHCDR 512000 LST)                    64      1856      1856      1.00
--------------------------------------------------------------------------------
Common sense - the curse in disguise. Because if you have it, you have to live with those that don't.

Marc'Antonio Alessi

  • Swamp Rat
  • Posts: 1451
  • Marco
Re: -={Test}=- NthCdr FirstN LastN Slice Member
« Reply #10 on: February 28, 2014, 08:00:28 AM »
BTW, here's a much simpler way of writing those power-of-10 CDR call defuns. This shouldn't affect performance, since it's only done on loading the lisp:
...
On my ACad 2014 on Win7-64 it will do up to CD10000R before it causes a stack overflow error - thus repeat only 4 times, on 5th I get an error, so CD100000R and above isn't possible.
It is a smart idea to build CdXXXXr functions, my tests I do not give very reliable results;
I have modified your function:
;old  (cons (read (strcat "cd" (itoa n) "r"))
;new  (cons (read (strcat "cd" (itoa n) "rI"))
Code: [Select]
(defun Cd10000rA (l)
  (Cd1000r(Cd1000r(Cd1000r(Cd1000r(Cd1000r(Cd1000r
  (Cd1000r(Cd1000r(Cd1000r(Cd1000r l))))))))))
)
(progn
  (setq aListStr '("Last"))
  (repeat 10000 (setq aListStr (cons (itoa (length aListStr)) aListStr)))
  (princ "\nLength aListStr: ") (princ (length aListStr)) (princ "\n ") (princ)
)
(Benchmark '(
(Cd10000rA aListStr)
(Cd10000rI aListStr)
(Cd10000rA aListStr)
(Cd10000rI aListStr)
)           )
3 bench with same data:
Code: [Select]
Elapsed milliseconds / relative speed for 2048 iteration(s):
    (CD10000RI ALISTSTR).....1373 / 1.35 <fastest>
    (CD10000RA ALISTSTR).....1732 / 1.07
    (CD10000RI ALISTSTR).....1841 / 1.01
    (CD10000RA ALISTSTR).....1857 / 1 <slowest>

Elapsed milliseconds / relative speed for 4096 iteration(s):
    (CD10000RI ALISTSTR).....1389 / 1.49 <fastest>
    (CD10000RI ALISTSTR).....1404 / 1.48
    (CD10000RA ALISTSTR).....1404 / 1.48
    (CD10000RA ALISTSTR).....2074 / 1 <slowest>

Elapsed milliseconds / relative speed for 4096 iteration(s):
    (CD10000RA ALISTSTR).....2824 / 1.26 <fastest>
    (CD10000RI ALISTSTR).....2902 / 1.23
    (CD10000RA ALISTSTR).....3260 / 1.1
    (CD10000RI ALISTSTR).....3572 / 1 <slowest>

Marc'Antonio Alessi

  • Swamp Rat
  • Posts: 1451
  • Marco
Re: -={Test}=- NthCdr FirstN LastN Slice Member
« Reply #11 on: February 28, 2014, 09:11:25 AM »
New results with last nthcdr version:
Code: [Select]
(defun NCdr (n l)   
  (repeat (/       n               10000) (setq l (Cd10000r l)))   
  (repeat (/ (setq n (rem n 10000)) 1000) (setq l (Cd1000r  l)))   
  (repeat (/ (setq n (rem n  1000))  100) (setq l (Cd100r   l)))   
  (repeat (/ (setq n (rem n   100))   10) (setq l (Cd10r    l)))   
  (repeat (/ (setq n (rem n    10))    4) (setq l (cddddr   l)))   
  (repeat            (rem n     4)        (setq l (cdr      l)))   
  l   
)   
(defun Cd10000r (l)
  (Cd1000r(Cd1000r(Cd1000r(Cd1000r(Cd1000r(Cd1000r
  (Cd1000r(Cd1000r(Cd1000r(Cd1000r l))))))))))
)
Code: [Select]
(progn
  (princ "\Posit: ")
  (princ (setq posit 22123456))
  (setq aListInt '("Last") Countr 0)
  (repeat 22123456 (setq aListInt (cons (setq Countr (1+ Countr)) aListInt)))
  (princ "\nLength aListInt: ") (princ (length aListInt)) (princ "\n ") (princ)
)
(Benchmark '(
(NCdr   posit aListInt)
(nthcdr posit aListInt)
(NCdr   posit aListInt)
(nthcdr posit aListInt)
)           )

Posit: 1000000
Length aListInt: 1000001
Elapsed milliseconds / relative speed for 32 iteration(s):
    (NCDR 1000000 ALISTINT).......1030 / 2.68 <fastest>
    (NTHCDR 1000000 ALISTINT).....1295 / 2.13
    (NTHCDR 1000000 ALISTINT).....2667 / 1.04
    (NCDR 1000000 ALISTINT).......2761 / 1 <slowest>


Posit: 12123456
Length aListInt: 12123457
Elapsed milliseconds / relative speed for 2 iteration(s):
    (NCDR POSIT ALISTINT).......1498 / 1.39 <fastest>
    (NTHCDR POSIT ALISTINT).....1935 / 1.07
    (NTHCDR POSIT ALISTINT).....2059 / 1.01
    (NCDR POSIT ALISTINT).......2075 / 1 <slowest>

Posit: 22123456
Length aListInt: 22123457
Elapsed milliseconds / relative speed for 2 iteration(s):
    (NCDR POSIT ALISTINT).......2777 / 1.36 <fastest>
    (NTHCDR POSIT ALISTINT).....3463 / 1.09
    (NTHCDR POSIT ALISTINT).....3760 / 1.01
    (NCDR POSIT ALISTINT).......3790 / 1 <slowest>

again
Posit: 22123456
Length aListInt: 22123457
Elapsed milliseconds / relative speed for 1 iteration(s):
    (NTHCDR POSIT ALISTINT).....1872 / 1.02 <fastest>
    (NTHCDR POSIT ALISTINT).....1888 / 1.01
    (NCDR POSIT ALISTINT).......1903 / 1
    (NCDR POSIT ALISTINT).......1904 / 1 <slowest>