views:

124

answers:

1

This piece of code is very slow. Execution from the slime-repl on my netbook takes a couple minutes.

(def test-array (make-array Integer/TYPE 400 400 3))

(doseq [x (range 400), y (range 400), z (range 3)]
   (aset test-array x y z 0))

Conversely, this code runs really fast:

(def max-one (apply max (map (fn [w] (apply max (map #(first %) w))) test-array)))
(def max-two (apply max (map (fn [w] (apply max (map #(second %) w))) test-array)))
(def max-three (apply max (map (fn [w] (apply max (map #(last %) w))) test-array)))

Does this have something to do with chunked sequences? Is my first example just written wrong?

+7  A: 

You're hitting Java reflection. This blog post has a workaround:

http://clj-me.cgrand.net/2009/10/15/multidim-arrays/

dnolen
Thanks for the link. I thought it might be reflection, but I am not getting any reflection warnings? Any idea why not?
dbyrne
Apparently `*warn-on-reflection*` doesn't always tell the whole story... See also http://clj-me.cgrand.net/2009/08/06/what-warn-on-reflection-doesnt-tell-you-about-arrays/
Michał Marczyk
With Clojure 1.2 you should get more reflection warnings on arrays.
cgrand