I tried using the type `(Fixnum -> Fixnum)', but there's a multiplication in the function.
At Sun, 4 Nov 2012 20:42:48 -0500, Matthias Felleisen wrote: > > Hmph. I would expect TR to perform as fast as 'unsafe'. > > > On Nov 4, 2012, at 7:40 PM, Matthew Flatt wrote: > > > 2668 msecs when I declare `cycle-length' as `(Integer -> Integer)' and > > change `(even? n)' to `else', or 2809 msecs if I add `[else 0]' instead > > of changing `(even? n)'. > > > > At Sun, 4 Nov 2012 18:30:21 -0600, Robby Findler wrote: > >> And just to complete the list, how does the TR version fare? > >> > >> Robby > >> > >> On Sun, Nov 4, 2012 at 6:26 PM, Matthew Flatt <mfl...@cs.utah.edu> wrote: > >>> Thanks! > >>> > >>> Sometimes, a x3 difference means that we're missing a straightforward > >>> opportunity in performance, and that was the case here. The Racket > >>> program spent most of its time in generic `/' by pessimistically > >>> expecting a non-integer result. > >>> > >>> I've adjusted the JIT to optimistically compute and check a fixnum > >>> result for a division of fixnums, and then the example runs about four > >>> times as fast on my machine: > >>> > >>> Old Racket: 12589 msec > >>> New Racket: 3850 msec > >>> Racket with `quotient': 3851 msec [old or new is the same] > >>> SBCL: 5553 msec > >>> SBCL, unsafe fixnum: 2692 msec > >>> New Racket, in module: 2823 msec > >>> Racket, unsafe fixnum: 2405 msec [uses `fxquotient'] > >>> > >>> At Sun, 4 Nov 2012 15:54:51 +0000 (UTC), daniel rupistraliz wrote: > >>>> > >>>> > >>>> racket: > >>>> Welcome to Racket v5.2.1. > >>>>> (define (cycle-length n) > >>>> (cond > >>>> [(= n 1) > >>>> 1] > >>>> [(odd? n) > >>>> (add1 (cycle-length (add1 (* 3 n))))] > >>>> [(even? n) > >>>> (add1 (cycle-length (/ n 2)))])) > >>>> > >>>> (time (for ([i (in-range 1 1000000)]) > >>>> (cycle-length i))) > >>>>> > >>>> cpu time: 15016 real time: 15018 gc time: 0 > >>>> > >>>> sbcl: > >>>> > >>>> (defun cycle-length(n) > >>>> (cond ((= n 1) 1) > >>>> ((oddp n) (1+ (cycle-length (1+ (* 3 n))))) > >>>> ((evenp n) (1+ (cycle-length (/ n 2)))))) > >>>> > >>>> > >>>> * (time (loop for i from 1 to 1000000 do (cycle-length i))) > >>>> > >>>> Evaluation took: > >>>> 6.192 seconds of real time > >>>> 6.192387 seconds of total run time (6.192387 user, 0.000000 system) > >>>> 100.00% CPU > >>>> 14,496,643,427 processor cycles > >>>> 0 bytes consed > >>>> > >>>> > >>>> With optimizations: > >>>> > >>>> (defun cycle-length(n) > >>>> (declare (fixnum n) > >>>> (ftype (function (fixnum) fixnum) cycle-length) > >>>> (optimize (speed 3) (safety 0) (compilation-speed 0))) > >>>> (cond ((= n 1) 1) > >>>> ((oddp n) (the fixnum (1+ (cycle-length > >>>> (the fixnum (1+ (the fixnum (* 3 > >>>> n)))))))) > >>>> ((evenp n) (cycle-length (the fixnum (/ n 2)))))) > >>>> > >>>> CL-USER> (time (loop for i from 1 to (expt 10 6) do (cycle-length i))) > >>>> Evaluation took: > >>>> 3.515 seconds of real time > >>>> 3.524220 seconds of total run time (3.524220 user, 0.000000 system) > >>>> 100.26% CPU > >>>> 8,228,949,701 processor cycles > >>>> 33,008 bytes consed > >>>> > >>>> So racket = 15 seconds > >>>> sbcl = 6 seconds > >>>> sbcl optimized = 3.5 seconds. > >>>> > >>>> > >>>> ____________________ > >>>> Racket Users list: > >>>> http://lists.racket-lang.org/users > >>> ____________________ > >>> Racket Users list: > >>> http://lists.racket-lang.org/users > > ____________________ > > Racket Users list: > > http://lists.racket-lang.org/users > > > ------------------------------------------------------------------------------ > [application/pkcs7-signature "smime.p7s"] [~/Desktop & open] [~/Temp & open] > ____________________ > Racket Users list: > http://lists.racket-lang.org/users ____________________ Racket Users list: http://lists.racket-lang.org/users