This reminds me of a bug that I believe Ghadi fixed for 1.11, https://clojure.atlassian.net/browse/CLJ-2621
Don’t know if that helps much, though. Erik. -- i farta > 15. mai 2022 kl. 14:11 skrev pete windle <goo...@pete23.com>: > > Hey, I'm trying to work on some performance sensitive code using Clojure > together with the Carrotsearch HPPC library. I've come up against a weird > behaviour of set! in conjunction with primitive maths. > > This example is a toy problem not a production problem, but there are things > I might not be harder to do at work w/Clojure. > > I have a com.carrotsearch.hppc.LongLongHashMap and I wish to sum the contents > of the map. They provide a com.carrotsearch.hppc.LongLongProcedure where an > apply method is called for each k, v. > > Thence: > (defprotocol ValueRetriever > (get-value [this ^LongLongHashMap memory])) > > (deftype ValueAdder [^{:unsynchronized-mutable true} ^long total] > LongLongProcedure > (^void apply [this ^long k ^long v] > (set! total (unchecked-add total v))) > ValueRetriever > (get-value [this memory] (set! total 0) (.forEach memory this) total)) > > To a first approximation all of the time spent summing the map is in the > apply method as expected, however when I profile it with YourKit every sample > taken is actually in clojure.lang.Numbers.num. Using the extremely handy > clj-java-decompiler library I can try to see what's happening, and it looks > like we're attempting to box the return value from set! > > public void apply(final long k, final long n) { > Numbers.num(this.total += n); > } > > > Is there some technique I can use to stop the return value from set! being > boxed (before the box is discarded to the void)? > > I do have real use cases where a rather tight aggregation loop will be called > for many millions of values and I'd prefer not to incur this cost. > > Workaround is obviously to write the aggregators in Java but that's strongly > not preferred, at the point I'm mixing modes I might as well write the whole > core in Java. > > Cheers, > > Pete Windle > > -- > 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 > --- > You received this message because you are subscribed to the Google Groups > "Clojure" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clojure+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/clojure/d9eccd28-3db3-4e6f-88f9-7a4106fc05aan%40googlegroups.com. -- 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 --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/clojure/13C1C76F-D17A-4940-959D-F555B4714CC2%40assum.net.