I'll second the use of core.matrix. It's a wonderful, idiomatic, fast 
library, and I hope to see folks continue to rally around it.


On Monday, December 22, 2014 3:47:59 AM UTC-7, Mikera wrote:
>
> 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.

Reply via email to