Hi guys,

In the example below, if map is replaced with pmap, it goes twice
slower on my MBP (2 CPUs).

I believe it's probably the (reduce + ...) causing it, but I can't
explain it.

Version with map:
user> (time (pnpolytest))
"Elapsed time: 3903.533 msecs"
6000000

Version with pmap:
user> (time (pnpolytest))
"Elapsed time: 7995.565 msecs"

What I'm doing wrong here?

(defn- pnpoly [npol #^floats xp #^floats yp x y]
  (let [npol (int npol)
        x (float x)
        y (float y)]
    (loop [r (int 0)
           i (int 0)
           xi (aget xp (dec npol))
           yi (aget yp (dec npol))]
      (if (< i npol)
        (let [xj xi xi (aget xp i)
              yj yi yi (aget yp i)]
          (if (or (= (> yi y) (> yj y))
                  (>= x (+ xi (/ (* (- xj xi)
                                    (- y  yi))
                                 (- yj yi)))))
            (recur (bit-not r) (inc i) xi yi)
            (recur          r  (inc i) xi yi)))
        (- r)))))

(defn pnpolytest []
  (let [xp
        (float-array
         [+0.0 +1.0 +1.0 +0.0 +0.0
          +1.0 -0.5 -1.0 -1.0 -2.0
          -2.5 -2.0 -1.5 -0.5 +1.0
          +1.0 +0.0 -0.5 -1.0 -0.5])
        yp
        (float-array
         [+0.0 +0.0 +1.0 +1.0 +2.0
          +3.0 +2.0 +3.0  0.0 -0.5
          -1.0 -1.5 -2.0 -2.0 -1.5
          -1.0 -0.5 -1.0 -1.0 -0.5])
        npol 20]
    (reduce +
            ;; Replace the nex map with pmap,
            ;; and things slow down
            (map (fn [_]
                   (+ (pnpoly npol xp yp  0.5   0.5)
                      (pnpoly npol xp yp  0.5   1.5)
                      (pnpoly npol xp yp -0.5   1.5)
                      (pnpoly npol xp yp  0.75  2.25)
                      (pnpoly npol xp yp  0.0   2.01)
                      (pnpoly npol xp yp -0.5   2.5)
                      (pnpoly npol xp yp -1.0  -0.5)
                      (pnpoly npol xp yp -1.5   0.5)
                      (pnpoly npol xp yp -2.25 -1.0)
                      (pnpoly npol xp yp  0.5  -0.25)
                      (pnpoly npol xp yp  0.5  -1.25)
                      (pnpoly npol xp yp -0.5  -2.5)))
                 (range 0 1000000)))))

Thanks,
Dimiter "malkia" Stanev



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

Reply via email to