I tried to convert this java code line for line to clojure to compare
the speed differences, and boy was I surprised!
public static void ConvertToAWT(byte[] cpuArray){
// Given an array of bytes representing a c-style bgra image,
// converts to a java style abgr image
int len = java.lang.reflect.Array.getLength(cpuArray);
for (int i = 0; i < len; i+=4){
byte b = cpuArray[i+0];
byte g = cpuArray[i+1];
byte r = cpuArray[i+2];
byte a = cpuArray[i+3];
cpuArray[i+0] = a;
cpuArray[i+1] = b;
cpuArray[i+2] = g;
cpuArray[i+3] = r; }}
(defn java-like []
(loop [i (int 0)] (if (< i buffer-size)
(let [ + clojure.core/unchecked-add
b (aget cpuArray i)
g (aget cpuArray (+ 1 i))
r (aget cpuArray (+ 2 i))
a (aget cpuArray (+ 3 i))]
(aset-byte cpuArray i a)
(aset-byte cpuArray (+ 1 i) b)
(aset-byte cpuArray (+ 2 i) g)
(aset-byte cpuArray (+ 3 i) r)
(recur (int (+ i 4)))))))
(defn clojure-like []
(doall (flatten (map (fn [[b g r a]] [a b g r]) (partition 4 4
cpuArray)))))
for a byte-array of size 1920000, the java-like clojure function, a
line for line translation, takes several minutes, while the java
method takes around 3 milliseconds.
the clojure-like one takes 6 seconds.
Why is the clojure function so much more obnoxiously slow than its
java counterpart?
Can anyone shed some light on what I'm doing wrong?
sincerely,
--Robert McIntyre
--
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