On Aug 7, 5:14 pm, John Harrop <jharrop...@gmail.com> wrote: > Your core loop seems to be: > (loop [zr (double 0.0) > zi (double 0.0) > zr2 (double 0.0) > zi2 (double 0.0) > iterations-remaining iterations-remaining] > (if (and (not (neg? iterations-remaining)) > (< (+ zr2 zi2) limit-square)) > (let [new-zi (double (+ (* (* f2 zr) zi) pi)) > new-zr (double (+ (- zr2 zi2) pr)) > new-zr2 (double (* new-zr new-zr)) > new-zi2 (double (* new-zi new-zi))] > (recur new-zr new-zi new-zr2 new-zi2 (dec iterations-remaining))) > > What I suggest is > > (loop [zr (double 0.0) > zi (double 0.0) > i (int (inc iterations-remaining))] > (let [zr2 (* zr zr) > zi2 (* zi zi)] > (if (and (not (= 0 i)) (< (+ zr2 zi2 limit-square))) > (recur (+ (- zr2 zi2) pr) (+ (* (* f2 zr) zi) pi) (unchecked-inc i)) > (whatever...)))) > > * Same calculations > * Less items in recur rebind > * Counter is also primitive > > (untested, may need slight tweakage)
Needed unchecked-dec in place of unchecked-inc, and I used (zero? i) instead of (= 0 i) (not sure if that makes much difference), and the results are much better -- the time went down to a little less than half of what it was before. http://github.com/jafingerhut/clojure-benchmarks/blob/fe10ef25ec17b77dd03f6d1ccff4f35273764f3b/RESULTS I also tried it with 4 parallel threads on my 2-core machine, and this problem parallelizes significantly better than the simpler problem in the "questions about pmap" discussion thread -- nearly half the elapsed time, and only 6% more total CPU time for the 4-thread version vs. the sequential version. Thanks! Andy --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---