2010-06-13 7 views
5

Ce code est très lent. L'exécution du slime-repl sur mon netbook prend quelques minutes.Problème de performance avec Clojure Array

(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)) 

A l'inverse, ce code fonctionne très vite:

(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))) 

Est-ce que cela a quelque chose à voir avec des séquences chunked? Mon premier exemple vient-il d'être mal écrit?

Répondre

7

Vous utilisez la réflexion Java. Ce billet de blog a une solution de contournement:

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

+0

Merci pour le lien. Je pensais que cela pourrait être une réflexion, mais je ne reçois aucun avertissement de réflexion? Une idée pourquoi pas? – dbyrne

+2

Apparemment '* warn-on-reflection *' ne dit pas toujours toute l'histoire ... Voir aussi http://clj-me.cgrand.net/2009/08/06/what-warn-on-reflection- doesnt-tell-you-about-arrays/ –

+0

Avec Clojure 1.2, vous devriez obtenir plus d'avertissements de réflexion sur les tableaux. – cgrand

0

Vous pourriez obtenir une meilleure performance de l'une des quatre mises en œuvre de la matrice Clojure disponibles via une seule interface core.matrix: at clojars, at github.