GrumpyLittleTed wrote: > Part of the difference (under 1.2) is due to the (substantial) > overhead of accessing the buffer-size var on every iteration. > > I ran a quick check and using David's version of the code result > averaged 17.2ms. Just changing buffer-size to a local with using (let > [buffer-size (int 1920000)]...) the time dropped to an average 3.4ms. >
Great! Now I remember that that same technique is used in Lua. See long this version takes. (set! *warn-on-reflection* true) (def buffer-size 1920000) (def array (byte-array buffer-size)) (defmacro add [m n] `(unchecked-add (int ~m) (int ~n))) (defmacro amove[a i j] `(aset ~a ~j (aget ~a ~i))) (defn java-like [^bytes cpu_array] (let [buffer-size (int buffer-size)] (loop [i (int 0)] (if (< i buffer-size) (let [ i2 (add i 1) i3 (add i 2) i4 (add i 3) a (aget cpu_array i4) ] (amove cpu_array i3 i4) (amove cpu_array i2 i3) (amove cpu_array i i2) (aset cpu_array i a) (recur (add i 4))))))) (dotimes [_ 10] (time (dotimes [_ 1] (java-like array)))) -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en