I can't see your code due to the IT policies here, but I can make some generalizations - these are assuming your code is correct and you're not accidentally using an exponential algorithm (which I wouldn't preclude, 4 minutes does sound truly excessively slow, even for vectors).
Vectors are significantly slower than Java arrays due to their copy-on- write semantics. You have a few options, both of which are considered perfectly acceptable Clojure for high-performance numerical code: 1. Use transients (http://clojure.org/transients) when you update your vectors. This should give you a pretty significant speed increase. 2. Alternatively, use native java arrays. Clojure provides a complete set of functions for creating and mutating raw Java arrays 3. Use type hints to eliminate reflection at choke points in your processing. If you do 2 and 3, you should get pretty close to native Java speeds. On May 28, 12:20 pm, Rubén Béjar <[email protected]> wrote: > Hi again, > I have tried a few more things: > I have done the same in Java but using an array > of Integers, instead of an array of ints. It just takes > 78 ms. (more than 16, still far less than 4 secs). > I have also tried with an update function which just returns a > fixed 1. It still takes some 400 ms. to update de > data vector of the CA. This is similar to the time > it is giving me to create a vector of 1's with this function: > (time (vec (repeat 250000 1))). > I was not expecting Clojure vectors so much slower than > Java arrays. Is that comparison so "unfair"? Next thing > I am trying is using Java Vectors in my Java > implementation... > Rubén > Rubén Béjar escribió:Hi all, > I am new to the list and to Clojure. I have been working in > implementing some 2D cellular automata (CA) just to have a project > to teach Clojure to myself. After some work I have something that > works, but it is pretty slow. The function that takes a CA > of 500x500 cells (integers) and returns an updated (*) copy > takes 4 s. (using Clojure vectors), while doing more or less the same in Java > (using arrays and primitive types) takes more or > less 16 *ms.*. I expected some difference, but not that big. Before > trying to use Java arrays and primitive types > in Clojure, I would like to know how my Clojure approach can > be improved (I am willing to sacrifice some performance to keep > it "more Clojure", but not that much). > As I do not want to post a bunch of horrible code full of comments > and not properly indented, I have extracted what i hope are the > main pieces, written some comments and posted it here:http://snipt.org/Okpk > Pasting that code in a new file in Eclipse (I am using > counterclockwise) and running it in the REPL prints this: > Clojure 1.1.0-alpha-SNAPSHOT > "Elapsed time: 4355.363706 msecs" > "Elapsed time: 4416.98562 msecs" > 1:1 user=> #<Namespace cellular-automata-basic> > 1:2 cellular-automata-basic=> > I would thank a lot any hint, suggestion, comment, or > whatever... :-) > Best regards, > Rubén > (*) The update consists on adding the values of the 8 neighbours > of every cell and changing it if that sum is between two fixed > numbers.-- Rubén BÉJAR HERNÁNDEZ Dpto. de Informática e Ingeniería de > Sistemas - Universidad de Zaragoza (Computing and Systems Engineering > Department - Universidad de Zaragoza) c/ María de Luna 1, 50018 Zaragoza, > Spain Tel: (+34) 976 76 2332 (Fax: 1914) e-mail:[email protected] IA3 > (IA3 Laboratory) -http://iaaa.cps.unizar.es On May 28, 12:20 pm, Rubén Béjar <[email protected]> wrote: > Hi again, > I have tried a few more things: > I have done the same in Java but using an array > of Integers, instead of an array of ints. It just takes > 78 ms. (more than 16, still far less than 4 secs). > I have also tried with an update function which just returns a > fixed 1. It still takes some 400 ms. to update de > data vector of the CA. This is similar to the time > it is giving me to create a vector of 1's with this function: > (time (vec (repeat 250000 1))). > I was not expecting Clojure vectors so much slower than > Java arrays. Is that comparison so "unfair"? Next thing > I am trying is using Java Vectors in my Java > implementation... > Rubén > Rubén Béjar escribió:Hi all, > I am new to the list and to Clojure. I have been working in > implementing some 2D cellular automata (CA) just to have a project > to teach Clojure to myself. After some work I have something that > works, but it is pretty slow. The function that takes a CA > of 500x500 cells (integers) and returns an updated (*) copy > takes 4 s. (using Clojure vectors), while doing more or less the same in Java > (using arrays and primitive types) takes more or > less 16 *ms.*. I expected some difference, but not that big. Before > trying to use Java arrays and primitive types > in Clojure, I would like to know how my Clojure approach can > be improved (I am willing to sacrifice some performance to keep > it "more Clojure", but not that much). > As I do not want to post a bunch of horrible code full of comments > and not properly indented, I have extracted what i hope are the > main pieces, written some comments and posted it here:http://snipt.org/Okpk > Pasting that code in a new file in Eclipse (I am using > counterclockwise) and running it in the REPL prints this: > Clojure 1.1.0-alpha-SNAPSHOT > "Elapsed time: 4355.363706 msecs" > "Elapsed time: 4416.98562 msecs" > 1:1 user=> #<Namespace cellular-automata-basic> > 1:2 cellular-automata-basic=> > I would thank a lot any hint, suggestion, comment, or > whatever... :-) > Best regards, > Rubén > (*) The update consists on adding the values of the 8 neighbours > of every cell and changing it if that sum is between two fixed > numbers.-- Rubén BÉJAR HERNÁNDEZ Dpto. de Informática e Ingeniería de > Sistemas - Universidad de Zaragoza (Computing and Systems Engineering > Department - Universidad de Zaragoza) c/ María de Luna 1, 50018 Zaragoza, > Spain Tel: (+34) 976 76 2332 (Fax: 1914) e-mail:[email protected] IA3 > (IA3 Laboratory) -http://iaaa.cps.unizar.es -- 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
