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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en