For most array operations (e.g. dot products on vectors), I strongly recommend trying out the recent core.matrix implementations. We've put a lot of effort into fast implementations and a nice clean Clojure API so I'd love to see them used where it makes sense!
For example vectorz-clj can be over 100x faster than a naive map / reduce implementation: (let [a (vec (range 10000)) b (vec (range 10000))] (time (dotimes [i 100] (reduce + (map * a b))))) "Elapsed time: 364.590211 msecs" (let [a (array :vectorz (range 10000)) b (array :vectorz (range 10000))] (time (dotimes [i 100] (dot a b)))) "Elapsed time: 3.358484 msecs" On Monday, 22 December 2014 17:31:41 UTC+8, Henrik Eneroth wrote: > > Interesting read Jose, thanks! > > It might be interesting to try a transducer on > > (defn dot-prod > "Returns the dot product of two vectors" > [v1 v2] > (reduce + (map * v1 v2))) > > if you can get your hands on the 1.7 alpha and the time and inclination to > do it. Transducers have shown to be faster than running functions in > sequence. Although I don't know how likely they are to beat native arrays, > probably not very much. > > > On Sunday, December 21, 2014 7:10:41 PM UTC+1, Jose M. Perez Sanchez wrote: >> >> >> Regarding the speed optimizations, execution time for a given model was >> reduced from 2735 seconds to 70 seconds, over several versions by doing >> several optimizations. >> >> The same calculation implemented in C# takes 12 seconds using the same >> computer and OS. Maybe the Clojure code can still be improved, but for the >> time being I'm happy with the Clojure version being six times slower, since >> the new software has many advantages. >> >> For these tests the model was the circle with radius 1 using the >> "diffmr1" tracker, the simulation was run using 10000 particles and 10000 >> total random walk steps. >> >> These modifications in the critical parts of the code accounted for most >> of the improvement: >> >> - Avoid reflection by using type hints. >> - Use Java arrays. >> - In some cases call Java arithmetic functions directly instead of >> Clojure ones. >> - Avoid using partial functions in the critical parts of the code. >> >> Avoiding lazyness did not help much. Regarding the use of Java arrays, >> there are many small functions performing typical vector operations on >> arrays, such as the following example: >> >> Using Clojure types: >> >> (defn dot-prod >> "Returns the dot product of two vectors" >> [v1 v2] >> (reduce + (map * v1 v2))) >> >> Using Java arrays: >> >> (defn dot-prod-j >> "Returns the dot product of two arrays of doubles" >> [^doubles v1 ^doubles v2] >> (areduce v1 i ret 0.0 >> (+ ret (* (aget v1 i) >> (aget v2 i))))) >> >> >> This gives a general idea of which optimizations helped the most. These >> changes are not in the public repository, since previous commits have been >> omitted because the code code was not ready for publication (different >> license disclaimer, contained email addresses, etc.). If anyone is >> interested in the diffs and the execution times over several optimizations, >> please contact me. >> >> Kind regards, >> >> Jose. >> >> >> On Sunday, December 21, 2014 3:38:35 AM UTC-5, Jose M. Perez Sanchez >> wrote: >>> >>> >>> Hi everyone: >>> >>> Sorry that it has taken so long. I've just released the software in >>> GitHub under the EPL. It can be found at: >>> >>> https://github.com/iosephus/gema >>> >>> >>> Kind regards, >>> >>> Jose. >>> >>> -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.