Andy Fingerhut <andy.finger...@gmail.com> writes: > My current best guess is the JVM's memory allocator, not Clojure code.
I didn’t mean to imply the problem was in Clojure itself, but I don’t believe the issue is in the memory allocator either. I now believe the problem is in a class of JIT optimization HotSpot is performing which turns into a “pessimization” in the parallel case. I have the following code, taking the structure from Cameron’s benchmarks, but replacing the exact functions being tested: https://gist.github.com/4246320 Note that `conj*` is simply a copy-paste of the `conj` implementation from clojure/core.clj. The benchmark runs reducing that `conj*` function once on `Cons`s, then on `PersistantList`s, then again on `Cons`s. And here are the results: cons-conj* : map-ms: 5.6, pmap-ms 1.1, speedup 5.08 list-conj* : map-ms: 10.1, pmap-ms 15.9, speedup 0.63 cons-conj* : map-ms: 10.0, pmap-ms 15.6, speedup 0.64 The function performs fine on `Cons` objects, but once applied to `PersistantList` objects, `conj*` somehow becomes “tainted” and acquires the inverse speedup factor. When I run with -XX:+PrintCompilation I don’t see anything particularly suspicious, but I’m not well-versed in the art of interpreting HotSpot’s entrails. My idea for next steps is to create a copy of the PersistantList class and selectively modify it in an attempt to identify what aspect of it causes the JVM to produce this behavior. -Marshall -- 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