I failed to get JavaFX compiler running on my Ubuntu, but I easily ran Chris's JRuby 1.1.6 test; so for calibration, my laptop comes in at 3:52, vs 4:22 on Chris's machine. Presumably we can scale results on my machine by 1.13.
Here's my Clojure version of the test:
(defn tak [#^Integer x #^Integer y #^Integer z]
(if (>= y x)
z
(recur (tak (- x 1) y z)
(tak (- y 1) z x)
(tak (- z 1) x y))))
(dotimes [n 1000] (tak 24 16 8))
It runs in about 50 seconds, or 56 after normalizing to Chris' machine speed. This puts Clojure north of JRuby and Groovy, but still 5 times slower than JavaFX.
If you remove the type hints, it runs in 4 minutes, or about the same time as JRuby -- and about 4 or 5 times slower than with type hints.
4 comments:
(defn tak [#^Integer x #^Integer y #^Integer z]
(if (<= y x)
z
(recur
((unchecked-dec x) y z)
((unchecked-dec y) z x)
((unchecked-dec z) x y))))
(dotimes [n 1000] (tak 24 16 8))
That code is wrong -- the comparison goes the other way -- and when I fixed that and run it, I get ClassCastException.
Anonymous probably meant to say:
(defn tak [#^Integer x #^Integer y #^Integer z]
(if (>= y x)
z
(recur (tak (unchecked-dec x) y z)
(tak (unchecked-dec y) z x)
(tak (unchecked-dec z) x y))))
With Clojure 1.3 it is much faster then original if you use:
(defn ^long tak [^long x ^long y ^long z]
(if (>= y x)
z
(recur (long (tak (- x 1) y z))
(long (tak (- y 1) z x))
(long (tak (- z 1) x y)))))
Post a Comment