On Wed, 12 Oct 2022, Damien Mattei <damien.mat...@gmail.com> wrote: > Hello, > all is in the title, i test on a approximately 30000 element list , i got > 9s with map and 3min 30s with par-map on exactly the same piece of > code!?
I can only speculate here. But trying with a very simple example here: --8<---------------cut here---------------start------------->8--- (use-modules (statprof)) (statprof (lambda () (par-map 1+ (iota 300000)))) --8<---------------cut here---------------end--------------->8--- Performance are terrible. I don't know how par-map is implemented, but if it does 1 element static scheduling -- which it probably does because you pass a linked list and not a vector -- then yeah you can assure that thing will be very slow. You're probably better off with dynamic scheduling with vectors. Here's a quick snippet I made for static scheduling but with vectors. Feel free to roll your own. --8<---------------cut here---------------start------------->8--- (use-modules (srfi srfi-1) (ice-9 threads)) (define* (par-map-vector proc input #:optional (max-thread (current-processor-count))) (let* ((block-size (quotient (vector-length input) max-thread)) (rest (remainder (vector-length input) max-thread)) (output (make-vector (vector-length input) #f))) (when (not (zero? block-size)) (let ((mtx (make-mutex)) (cnd (make-condition-variable)) (n 0)) (fold (lambda (scale output) (begin-thread (let lp ((i 0)) (when (< i block-size) (let ((i (+ i (* scale block-size)))) (vector-set! output i (proc (vector-ref input i)))) (lp (1+ i)))) (with-mutex mtx (set! n (1+ n)) (signal-condition-variable cnd))) output) output (iota max-thread)) (with-mutex mtx (while (not (< n max-thread)) (wait-condition-variable cnd mtx)))) (let ((base (- (vector-length input) rest))) (let lp ((i 0)) (when (< i rest) (let ((i (+ i base))) (vector-set! output i (proc (vector-ref input i)))) (lp (1+ i))))) output)) --8<---------------cut here---------------end--------------->8--- -- Olivier Dion oldiob.dev