I believe this is a symptom of the fact that the Clojure compiler isn't very type aware, and = inserts a bunch of redundant runtime type checks (see clojure.lang.Util.equiv(Object, Object) )
In particular, it always checks for whether the arguments are instances of Number or IPersistentCollection first, because these get special handling, before calling Keyword.equals(). Obviously, these checks are pointless if you already know one or both arguments is a keyword, but the compiler doesn't make that inference at compile time so we have to pay the runtime overhead. These type checks are pretty cheap, but certainly not free. It's also possible that the JVM isn't inlining as much as it could. On Saturday, 11 October 2014 06:23:10 UTC+8, Jony Hudson wrote: > > Hi All, > > I've been optimising a piece of code lately, and have come to wonder > about the performance of keyword comparison. Specifically, I'm not sure > whether the performance I'm seeing is what is expected. The data structures > page on clojure.org [1] indicates that keywords "provide very fast > equality tests". If I micro-benchmark with criterium, then I find the > following: > > As a baseline, comparing integers with `(= 0 1)` takes around 4ns. > > Comparing keywords with `(= :plus :minus)` takes around 30ns. > > This is about the same amount of time it takes to compare strings, `(= > "plus" "minus")`, which comes in at about 25ns. > > This surprised me, as I would have guessed that "fast" would have been > closer to the integer performance than the string performance. It's worth > saying that I don't know a lot about benchmarking, but I do have some > "real" code that's performance depends heavily on comparisons, and it seems > to line up performance-wise with these micro-benchmarks. > > So, am I doing something silly (like I don't know about the fast = for > keywords)? Or, are my expectations wrong, and this is about how long "fast" > should be? Or is there a performance bug lurking? > > I'm using Clojure 1.6.0 (but have tried 1.5.0 and 1.7.0-alpha1 with > similar results). > x86_64 Mac OS X 10.9.5 4 cpu(s) > > Java HotSpot(TM) 64-Bit Server VM 25.5-b02 > > Thanks in advance for any input, > > > Jony > > [1] http://clojure.org/data%5Fstructures > -- 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. For more options, visit https://groups.google.com/d/optout.