Advertisement
Guest User

Untitled

a guest
May 18th, 2018
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 2.48 KB | None | 0 0
  1.  
  2. (defun count-1-bits/optimized (n &aux (bits 0))
  3.   (declare (optimize (speed 3) (debug 0))
  4.            (type (and unsigned-byte fixnum) bits)
  5.            (type unsigned-byte n))
  6.   (if (typep n 'fixnum)
  7.       (locally
  8.           (declare (type fixnum n))
  9.         (loop :while (plusp n) :do
  10.           (when (oddp n)
  11.             (incf bits))
  12.           (setf n (ash n -1))))
  13.       (loop :while (plusp n) :do
  14.         (when (oddp n)
  15.           (incf bits))
  16.         (setf n (ash n -1))))
  17.   bits)
  18.  
  19. (defun count-1-bits/not-optimized (n)
  20.   (check-type n unsigned-byte)
  21.   (labels ((count-bits (n)
  22.              (if (< n 256)
  23.                  (aref #.(coerce (loop
  24.                                    :for n :below 256
  25.                                    :collect (loop :for i :below 8 :when (logbitp i n) :sum 1))
  26.                                  'vector)
  27.                        n)
  28.                  (let ((divisor (expt 2 (truncate (integer-length n) 2))))
  29.                    (multiple-value-bind (left right)  (truncate n divisor)
  30.                      (+ (count-bits left)
  31.                         (count-bits right)))))))
  32.     (count-bits n)))
  33.  
  34.  
  35.  
  36. (defun count-1-bits/not-optimized-loop (n)
  37.   (check-type n unsigned-byte)
  38.   (loop
  39.     :for i :below (integer-length n) :by 8
  40.     :for byte := (ldb (byte 8 i) n)
  41.     :sum (aref #.(coerce (loop
  42.                            :for n :below 256
  43.                            :collect (loop :for i :below 8 :when (logbitp i n) :sum 1))
  44.                          'vector)
  45.                byte)))
  46.  
  47.  
  48. (defun test ()
  49.   (loop
  50.     :with sa := 0
  51.     :with sb := 0
  52.     :with sc := 0
  53.     :with rep := 20
  54.     :repeat rep
  55.     :do (let ((n (random (expt 2 4096))))
  56.           (let* ((a)
  57.                  (b)
  58.                  (c)
  59.                  (ta (com.informatimago.common-lisp.cesarum.time:chrono-run-time
  60.                        (setf a (count-1-bits/optimized n))))
  61.                  (tb (com.informatimago.common-lisp.cesarum.time:chrono-run-time
  62.                        (setf b (count-1-bits/not-optimized n))))
  63.                  (tc (com.informatimago.common-lisp.cesarum.time:chrono-run-time
  64.                        (setf c (count-1-bits/not-optimized-loop n)))))
  65.             (assert (= a b c))
  66.             (incf sa ta)
  67.             (incf sb tb)
  68.             (incf sc tc)))
  69.     :finally (format t "~&average optimized          = ~,9f~%average non-optimized      = ~,9f~%average non-optimized-loop = ~,9f~%"
  70.                      (/ sa rep) (/ sb rep) (/ sc rep))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement