2010-06-13 33 views
5

Đoạn mã này là rất chậm. Thực hiện từ slime-repl trên netbook của tôi mất một vài phút.Vấn đề về hiệu suất với 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)) 

Ngược lại, mã này chạy rất nhanh:

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

Điều này có cái gì để làm với chuỗi chunked? Ví dụ đầu tiên của tôi có được viết sai không?

Trả lời

7

Bạn đang đánh phản chiếu Java. bài viết trên blog này có một cách giải quyết:

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

+0

Cảm ơn bạn đã liên kết. Tôi nghĩ nó có thể là sự phản chiếu, nhưng tôi không nhận được bất kỳ cảnh báo phản chiếu nào? Bất kỳ ý tưởng tại sao không? – dbyrne

+2

Rõ ràng là '* cảnh báo-trên-phản ánh *' không phải lúc nào cũng kể toàn bộ câu chuyện ... Xem thêm http://clj-me.cgrand.net/2009/08/06/what-warn-on-reflection- doesnt-tell-you-about-arrays/ –

+0

Với Clojure 1.2 bạn sẽ nhận được nhiều cảnh báo phản chiếu hơn trên mảng. – cgrand

0

Bạn có thể có được hiệu suất tốt hơn từ một trong bốn triển khai ma trận Clojure có sẵn thông qua một giao diện duy nhất core.matrix: at clojars, at github.

Các vấn đề liên quan