(declaim (optimize (speed 3) (space 0) (safety 0) (debug 0))) (defmacro bench (&body code) (let ((start-time (gensym)) (end-time (gensym))) `(let ((,start-time (get-internal-real-time))) ,@code (let ((,end-time (get-internal-real-time))) (/ (- ,end-time ,start-time) internal-time-units-per-second))))) (defun ulps (&optional (iterations 10000000)) (/ iterations (bench (loop for i fixnum from iterations downto 1)))) (format t "~A megaulps~%" (round (/ (ulps) 1000000)))