Reducers and pmap have different approaches to concurrency.

pmap works a lot like map, except that instead of evaluating the seq one
item at a time, it spins up N threads which work on the next N items in
parallel. N is 2 + the number of CPU cores you have.

The reducers library works in a rather different way. It's important to
understand that the reducers library is split into reduce functions and
combine functions. The idea is that a collection is split up into equal
parts, then given to reduce functions in separate threads. Finally, all the
separate results are stuck back again by folding over the combine function.

If you're just using something like:

  (into [] (r/map blur (vec indexes))

Then you're only using the reduce function. The parallelism is initiated by
the fold, so instead you want:

  (r/foldcat (r/map blur (vec indexes))

By default, this will split the vector into pieces 512 in length, map
"blur" over each piece in parallel, then fold the pieces back together
again using the r/cat function, which is designed to be performant at
concatenating the pieces of a fold back together again.

My guess is that for your particular use-case, pmap is going to be faster.
The reducers library shines when you start to get into situations that pmap
can't handle.

- James

On 15 July 2015 at 04:02, Daniel Higginbotham <nonrecurs...@gmail.com>
wrote:

> I’ve been trying to better understand ways to increase the performance of
> Clojure programs and I’ve run into an interesting issue with using the
> reducers library. I’d love any help! The code I’m working on is at
> https://github.com/flyingmachine/quil-pix/tree/4cce95390f5ac7a206cc14a8ec5a4a2492c813fc
>
> The issue I’m having is that reducers/map has the same performance as
> core/map, and it doesn’t seem like that should be the case. (The current
> code (
> https://github.com/flyingmachine/quil-pix/blob/4cce95390f5ac7a206cc14a8ec5a4a2492c813fc/src/quil_pix/blur.clj#L73)
> uses mapv, but I’ve also tried just map.) pmap is ~3x faster.
>
> Surely reducers/map should be faster, but it doesn’t seem like I’ve done
> something wrong? This is driving me crazy :)
>
> Daniel
>
> --
> 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.
>

-- 
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