(in-package :cl-user) (defparameter *1* nil) (defparameter *2* :unknown) (defun frob1 (x) (setf *1* x)) (defun frob2 (x) (declare (dynamic-extent x)) (setq *2* (= x 11.0d0))) (defun jl1 (x count) (declare (optimize (speed 3) (safety 0)) (type double-float x) (type fixnum count)) (let ((sum x)) (declare (type double-float sum)) (dotimes (i count sum) (incf sum x)))) (defun jl2.1 (x count) (declare (optimize (speed 3) (safety 0)) (type double-float x) (type fixnum count)) (setq *1* nil) (let ((sum x)) (declare (type double-float sum)) (dotimes (i count sum) (incf sum i) (frob1 sum)))) (defun jl2.2 (x count) (declare (optimize (speed 3) (safety 0)) (type double-float x) (type fixnum count)) (setq *2* :unknown) (let ((sum x)) (declare (type double-float sum)) (dotimes (i count sum) (incf sum i) (frob2 sum)))) (defun jl3 (x count fun) (declare (optimize (speed 3) (safety 0)) (type double-float x) (type fixnum count)) (declare (type (function (t) t) fun)) (setq *2* :unknown) (setq *1* nil) (let ((sum x)) (declare (type double-float sum)) (dotimes (i count sum) (incf sum i) (funcall fun sum)))) (defun jl4.1 (x count) (declare (optimize (speed 3) (safety 0)) (type double-float x) (type fixnum count)) (setq *1* nil) (let ((sum x)) (declare (type double-float sum) (dynamic-extent sum)) (dotimes (i count (* sum 1.0d0)) (incf sum 1.0d0) (frob1 sum)))) (defun jl4.2 (x count) (declare (optimize (speed 3) (safety 0)) (type double-float x) (type fixnum count)) (setq *2* :unknown) (let ((sum x)) (declare (type double-float sum) (dynamic-extent sum)) (dotimes (i count (* sum 1.0d0)) (incf sum 1.0d0) (frob2 sum)))) #| (format *trace-output* "~&~%jl1:") (time (jl1 1.0d0 10)) (format *trace-output* "~&~%jl2.1:") (time (jl2.1 1.0d0 10)) (print *1*) (format *trace-output* "~&~%jl2.2:") (time (jl2.2 1.0d0 10)) (print *2*) (format *trace-output* "~&~%jl3(frob1):") (time (jl3 1.0d0 10 #'frob1)) (print *1*) (format *trace-output* "~&~%jl3(frob2):") (time (jl3 1.0d0 10 #'frob2)) (print *2*) (format *trace-output* "~&~%jl4.2:") (time (jl4.2 1.0d0 10)) (print *2*) (format *trace-output* "~&~%jl4.1:") (time (jl4.1 1.0d0 10)) (print *1*) |#