Thanks all for advise and sorry for the double post. 
Will check this out tonight and get back.

Cheers,
kuba

On Wednesday, May 1, 2013 11:09:05 AM UTC-7, kuba roth wrote:
>
> Hi there, 
>
> I'm currently testing a map/pmap performance and run into weird 
> behavior in Clojure running on a OSX (compered to Linux). 
> Running a 'slow' (processor intensive pmap function on OSX suffers 
> from very poor performance whereas the same function on Linux runs 
> just fine. 
> At the first glance looks like there is a oversubsription of threads 
> taking place on OSX and I don't fully understand if the problem is 
> part of my code or is this perhaps a bug on OSX platform. (Clojure 
> 1.4) 
>
> Here is the slow function, I need to stress it  that using Thread/ 
> sleep to create dummy long running job doesn't seem to cause this 
> problem. Realizing long sequence made a trick for me and force all 
> procsc to run on 100%. 
>
> ; Processor intensive process which will run in parallel 
> ; Notice Thread/sleep is not used - since it doesn't use processor 
> (more appropriate for imitating I/O stuff) 
> (defn myFunc [input] 
>   ;(Thread/sleep 500)                  ;; this doesn't use processor 
>   (doseq [n (take 10000000 (range))])  ;; some slow dummy process 
>   (println (str "---" input))              ;; some side effect to 
> track down roughly the progress 
>   ) 
>
>  ...and the results: 
> OSX - dual-core: 
> (time (doall (pmap #(myFunc %) (take 4 (range)))))      "Elapsed time: 
> 30263.3 msecs" 
> (time (doall (map #(myFunc %) (take 4 (range)))))          "Elapsed 
> time: 9239.3 msecs" 
>
> Linux 12core - the vector to iterate over has been increased to avoid 
> tha case where there are more cores then tasks: 
> (time (doall (pmap #(myFunc %) (take 100 (range)))))    "Elapsed time: 
> 16408.8 msecs" 
> (time (doall (map #(myFunc %) (take 100 (range)))))     "Elapsed time: 
> 150310.1 msecs" 
>
>
> I've got more examples for OSX which clearly shows that as soon as the 
> number of tasks exceeds number of cores pmap performance suffers. It 
> seems to me like there is no blocking taking place on threads and all 
> the tasks are started at the same time. 
>
> I've also run a test using Agents (pardon my code style) but the 
> problem seems to show up there too. All tasks in the range gets 
> submitted instantly causing oversubscribtion, so no task blocking is 
> taking a place. 
>
>
> ;forced single threaded 
> (time (doseq [x (take 100 (range))] 
>   (send (agent 0)  (myFunc x))                        ; still single 
> threaded... - I wonder if there is a better way to do that? 
>   )) 
>
> ; parallel 
> (time (doseq [x (take 100 (range))] 
>   ;(send (agent x)  myFunc )                  ; 
>   )) 
>
>
> With Agents, on linux parallel was way faster whereas on OSX a 
> magnitude slower: 
> linux parallel thr - 1min 52s 
> linux single thr   - 9min 35s 
>
>
> Thanks, 
> Kuba 
>

-- 
-- 
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/groups/opt_out.


Reply via email to