Advertisement
Guest User

Untitled

a guest
May 18th, 2018
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 2.70 KB | None | 0 0
  1.  
  2. ;; ---- (count-1.lisp) ----------------------------------------------------
  3.  
  4. (defun count-1-bits/optimized (n &aux (bits 0))
  5.   (declare (optimize (speed 3) (debug 0))
  6.            (type (and unsigned-byte fixnum) bits)
  7.            (type unsigned-byte n))
  8.   (if (typep n 'fixnum)
  9.       (locally
  10.           (declare (type fixnum n))
  11.         (loop :while (plusp n) :do
  12.           (when (oddp n)
  13.             (incf bits))
  14.           (setf n (ash n -1))))
  15.       (loop :while (plusp n) :do
  16.         (when (oddp n)
  17.           (incf bits))
  18.         (setf n (ash n -1))))
  19.   bits)
  20.  
  21.  
  22. (defun count-1-bits/not-optimized (n)
  23.   (check-type n unsigned-byte)
  24.   (labels ((count-bits (n)
  25.              (if (< n 256)
  26.                  (aref #.(coerce (loop
  27.                                    :for n :below 256
  28.                                    :collect (loop :for i :below 8 :when (logbitp i n) :sum 1))
  29.                                  'vector)
  30.                        n)
  31.                  (let ((divisor (max (truncate (log (integer-length n) 2) 2)
  32.                                      256)))
  33.                    (multiple-value-bind (left right)  (truncate n divisor)
  34.                      (+ (count-bits left)
  35.                         (count-bits right)))))))
  36.     (count-bits n)))
  37.  
  38. (defun test ()
  39.   (loop
  40.     :with sa := 0
  41.     :with sb := 0
  42.     :with rep := 20
  43.     :repeat rep
  44.     :do (let ((n (random (expt 2 4096))))
  45.           (let* ((a)
  46.                  (b)
  47.                  (ta (com.informatimago.common-lisp.cesarum.time:chrono-run-time
  48.                        (setf a (count-1-bits/optimized n))))
  49.                  (tb (com.informatimago.common-lisp.cesarum.time:chrono-run-time
  50.                        (setf b (count-1-bits/not-optimized n)))))
  51.             (assert (= a b))
  52.             (incf sa ta)
  53.             (incf sb tb)))
  54.     :finally (format t "~&average optimized     = ~,9f~%average non-optimized = ~,9f~%"
  55.                      (/ sa rep) (/ sb rep))))
  56.  
  57. ;; ------------------------------------------------------------------------
  58. #|
  59.  
  60.  
  61. cl-user> (load (compile-file #P"~/Desktop/lisp/count-1.lisp"))
  62. #P"/Users/pjb/Desktop/lisp/count-1.dx64fsl"
  63. cl-user> (test)
  64. average optimized     = 0.002871750
  65. average non-optimized = 0.000687450
  66. nil
  67. cl-user> (test)
  68. average optimized     = 0.002862700
  69. average non-optimized = 0.000653150
  70. nil
  71. cl-user> (test)
  72. average optimized     = 0.002799100
  73. average non-optimized = 0.000717150
  74. nil
  75. cl-user> (test)
  76. average optimized     = 0.002888150
  77. average non-optimized = 0.000745800
  78. nil
  79. cl-user> (test)
  80. average optimized     = 0.002842350
  81. average non-optimized = 0.000666450
  82. nil
  83. cl-user> (test)
  84. average optimized     = 0.002860200
  85. average non-optimized = 0.000701350
  86. nil
  87.  
  88. |#
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement