"nicolas.o...@gmail.com" <nicolas.o...@gmail.com> writes: > What happens if your run it a third time at the end? (The question > is related to the fact that there appears to be transition states > between monomorphic and megamorphic call sites, which might lead to > an explanation.)
Same results, but your comment jogged my reading and analysis is what I believe is the right direction. This is a potentially grandiose claim, but I believe the inverse speedup is due to contention caused by JVM type profiling in megamorphic call sites. Unfortunately -XX:-UseTypeProfile doesn’t appear to turn off type profiling itself, so I can’t prove this claim definitively without going even further down the rabbit hole and grubbing through the JVM source code. To back up this claim, I present the following modified `conj*`: (defn conj* [coll x] (let [a (long-array 32)] (dotimes [n 5] (dotimes [i 32] (aset a i n))) (clojure.lang.RT/conj coll x))) And the resulting profiling numbers: list-conj* : map-ms: 42.0, pmap-ms 24.8, speedup 1.69 cons-conj* : map-ms: 39.7, pmap-ms 25.1, speedup 1.58 Adding busy-work (and an extra allocation!) to the loop improved the speed-up, I believe by decreasing the relative portion of the call execution time during which the callsite type profile information is being updated. If I’m correct, the `Cons` and `PersistentList` `.cons` implementations are so tight that in their base versions the type profiling forms a significant enough portion of the total call that the updates are in frequent conflict. Adding busy-work to the `conj*` call adds some jitter which prevents them from contending quite as frequently. I’m not sure what the next steps are. Open a bug on the JVM? This is something one can attempt to circumvent on a case-by-case basis, but IHMO has significant negative implications for Clojure’s concurrency story. -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