OK, data is good.
Here is what Gambit expands your code to, with some annotations:
heine:~/Downloads> gsc -c -expansion conversion.scm Expansion:
(define noop (lambda () #!void))
The following implies that gsc could expand (floor n) better as:
(cond ((fixnum? n) n) ((and ('#<procedure #2 ##flonum?> n) ('#<procedure #3 ##flfinite?> n))('#<procedure #4 ##flfloor> n)) (else('#<procedure #5 floor> n))))
and it could expand inexact->exact better (after defining flfixnum?) as
(cond ((fixnum? n) n) ((and (flonum? n) (flinteger? n)(flfixnum? n)) (flonum->fixnum n)) (else (<inexact->exact> n))
(define ->integer (lambda (n) (lambda () (let ((temp.5 (if (and ('#<procedure #2 ##flonum?> n) ('#<procedure #3 ##flfinite?> n)) ('#<procedure #4 ##flfloor> n) ('#<procedure #5 floor> n)))) (if ('#<procedure #6 ##fixnum?> temp.5) temp.5 ('#<procedure #7 inexact->exact> temp.5))))))
(define ->flonum (lambda (n) (lambda () (if ('#<procedure #6 ##fixnum?> n) ('#<procedure #8 ##fl<-fx> n) (if ('#<procedure #2 ##flonum?> n) n ('#<procedure #9 exact->inexact> n))))))
This following machinery seems pretty heavy. I'd suggest
(define (test t #!optional (seconds 1.)) (let loop ((n 1)) (let ((start-time (cpu-time))) (do ((i 0 (fx+ i 1))) ((fx= i n)) (t)) (let ((end-time (cpu-time))) (if (<= seconds (fl- end-time start-time)) (pp (/ n (fl- end-time start-time))) (loop (fx* n 2)))))))
(define test (lambda (t #!optional (seconds 5)) (let ((at ('#<procedure #10 ##box> 0))) (let ((th (thread-start! (make-thread (lambda () (letrec ((loop (lambda (t at) (let ((begin-temp.1 (t))) (let ((begin-temp.0 ('#<procedure #11 ##set-box!> at (let ((temp.7 ('#<procedure #12 ##unbox> at))) (if ('#<procedure #6 ##fixnum?> temp.7) (let ((temp.9 ('#<procedure #13 ##fx+?> temp.7 1))) (if temp.9 temp.9 ('#<procedure #14 fx+> temp.7 1))) ('#<procedure #14 fx+> temp.7 1)))))) (loop t at)))))) (loop t at))))))) (let ((begin-temp.3 (thread-sleep! seconds))) (let ((r ('#<procedure #12 ##unbox> at))) (let ((begin-temp.2 (thread-terminate! th))) (let ((temp.12 (if (and ('#<procedure #2 ##flonum?> seconds) ('#<procedure #2 ##flonum?> r)) ('#<procedure #15 ##fl/> r seconds) ('#<procedure #16 /> r seconds)))) (if ('#<procedure #6 ##fixnum?> temp.12) ('#<procedure #8 ##fl<-fx> temp.12) (if ('#<procedure #2 ##flonum?> temp.12) temp.12 ('#<procedure #9 exact->inexact> temp.12)))))))))))
With that, my rates are (first for void, then the four ->integer, then the four ->flonum):
76082403.02475469
18077766.69130593 2113932.395354323 12632656.242117403 1560283.434666285
34377410.006859235 69323006.15509051 1230645.7282318561 69180045.37858963
And, with (declare (not safe)) I get
105510445.88390666
18807367.927219782 2444080.701261633 13230418.609566122 1569627.036643679
47124065.98183112 92942772.26488659 1327228.230636181 92942772.26488681