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.

Reply via email to