Excellent, great to hear it! Big thanks to Anton who posted it on Twitter originally (https://twitter.com/PieCalculus/status/468621724205203456) and then took the time to send me a beautiful smoking gun report for reproducibility. The rest was easy.
On Fri, Sep 5, 2014 at 8:34 PM, Nicola Mometto <brobro...@gmail.com> wrote: > > Since tools.analyzer, tools.analyzer.jvm and tools.emitter.jvm are all > multimethod intensive, I wondered if the multimethod default value > caching commit had any significant impact in their performance. > > After stress testing tools.emitter.jvm using clojure 1.7.0-alpha1 (no > multimethod patch) and clojure 1.7.0-alpha2 (w/ multimethod patch) I've > compared the results and I'm consistently getting a 15% speedup using > clojure 1.7.0-alpha2. > > Sounds like a big win to me! > > Nicola > > Alex Miller writes: > > > Clojure 1.7.0-alpha1 is now available. > > > > Try it via > > - Download: > > http://central.maven.org/maven2/org/clojure/clojure/1.7.0-alpha2/ > > - Download securely: > > https://repo1.maven.org/maven2/org/clojure/clojure/1.7.0-alpha2/ > > - Leiningen: [org.clojure/clojure "1.7.0-alpha2"] > > > > Highlights below, full change log here: > > https://github.com/clojure/clojure/blob/master/changes.md > > > > For users of Clojure 1.7.0-alpha1, there have been a few important > changes > > in transducers since alpha1: > > - Removed flatmap transducer > > - Added cat transducer > > - mapcat 1-arity is now a transducer, specifically: (comp (map f) cat) > > - The completing function has been lifted to be public > > > > Clojure 1.7.0-alpha2 has the changes below from 1.6.0: > > > > ## 1 New and Improved Features > > > > ### 1.1 Transducers > > > > Transducers is a new way to decouple algorithmic transformations from > their > > application in different contexts. Transducers are functions that > transform > > reducing functions to build up a "recipe" for transformation. > > > > Also see: http://blog.cognitect.com/blog/2014/8/6/transducers-are-coming > > > > Many existing sequence functions now have a new arity (one fewer argument > > than before). This arity will return a transducer that represents the > same > > logic but is independent of lazy sequence processing. Functions included > > are: > > > > * conj (conjs to []) > > * map > > * mapcat > > * filter > > * remove > > * take > > * take-while > > * drop > > * drop-while > > * cycle > > * take-nth > > * replace > > * partition-by > > * partition-all > > * keep > > * keep-indexed > > > > Additionally some new transducer functions have been added: > > > > * cat - concatenates the contents of each input > > * de-dupe - removes consecutive duplicated values > > * random-sample - returns items from coll with random probability > > > > And this function can be used to make completing transforms: > > > > * completing > > > > There are also several new or modified functions that can be used to > apply > > transducers in different ways: > > > > * sequence - takes a transformation and a coll and produces a lazy seq > > * transduce - reduce with a transformation (eager) > > * iteration - returns an iterable/seqable/reducible seq of applications > of > > the transducer to items in coll. Applications are re-performed with every > > iterator/seq/reduce. > > * run! - run the transformation for side effects on the collection > > > > There have been a number of internal changes to support transducers: > > > > * volatiles - there are a new set of functions (volatile!, vswap!, > vreset!, > > volatile?) to create and use volatile "boxes" to hold state in stateful > > transducers. Volatiles are faster than atoms but give up atomicity > > guarantees so should only be used with thread isolation. > > * array iterators - added support for iterators over arrays > > > > Some issues created and addressed during development: > > * [CLJ-1511](http://dev.clojure.org/jira/browse/CLJ-1511) > > * [CLJ-1497](http://dev.clojure.org/jira/browse/CLJ-1497) > > > > ### 1.2 Keyword and Symbol Construction > > > > In response to issues raised in [CLJ-1439]( > > http://dev.clojure.org/jira/browse/CLJ-1439), > > several changes have been made in symbol and keyword construction: > > > > 1) The main bottleneck in construction of symbols (which also occurs > inside > > keywords) was > > interning of the name and namespace strings. This interning has been > > removed, resulting > > in a performance increase. > > > > 2) Keywords are cached and keyword construction includes a cache check. A > > change was made > > to only clear the cache reference queue when there is a cache miss. > > > > ### 1.3 Warn on Boxed Math > > > > One source of performance issues is the (unintended) use of arithmetic > > operations on > > boxed numbers. To make detecting the presence of boxed math easier, a > > warning will now > > be emitted about boxed math if \*unchecked-math* is enabled. > > > > Example use: > > > > user> (defn plus-2 [x] (+ x 2)) ;; no warning, but boxed > > #'user/plus-2 > > user> (set! *unchecked-math* true) > > true > > user> (defn plus-2 [x] (+ x 2)) ;; now we see a warning > > Boxed math warning, NO_SOURCE_PATH:10:18 - call: public static > > java.lang.Number > > clojure.lang.Numbers.unchecked_add(java.lang.Object,long). > > #'user/plus-2 > > user> (defn plus-2 [^long x] (+ x 2)) ;; use a hint to avoid boxing > > #'user/plus-2 > > > > * [CLJ-1325](http://dev.clojure.org/jira/browse/CLJ-1325) > > > > ### 1.4 update - like update-in for first level > > > > `update` is a new function that is like update-in specifically for > > first-level keys: > > > > (update m k f args...) > > > > Example use: > > > > user> (update {:a 1} :a inc) > > {:a 2} > > user> (update {:a 1} :a + 2) > > {:a 3} > > user> (update {} :a identity) ;; missing returns nil > > {:a nil} > > > > * [CLJ-1251](http://dev.clojure.org/jira/browse/CLJ-1251) > > > > ## 2 Enhancements > > > > ### 2.1 Error messages > > > > * [CLJ-1261](http://dev.clojure.org/jira/browse/CLJ-1261) > > Invalid defrecord results in exception attributed to consuming ns > instead > > of defrecord ns > > * [CLJ-1169](http://dev.clojure.org/jira/browse/CLJ-1169) > > Report line,column, and source in defmacro errors > > > > ### 2.2 Documentation strings > > > > No changes. > > > > ### 2.3 Performance > > > > * [CLJ-1430](http://dev.clojure.org/jira/browse/CLJ-1430) > > Improve performance of partial with more unrolling > > * [CLJ-1384](http://dev.clojure.org/jira/browse/CLJ-1384) > > clojure.core/set should use transients for better performance > > * [CLJ-1429](http://dev.clojure.org/jira/browse/CLJ-1429) > > Cache unknown multimethod value default dispatch > > > > ### 2.4 Other enhancements > > > > * [CLJ-1191](http://dev.clojure.org/jira/browse/CLJ-1191) > > Improve apropos to show some indication of namespace of symbols found > > * [CLJ-1378](http://dev.clojure.org/jira/browse/CLJ-1378) > > Hints don't work with #() form of function > > * [CLJ-1498](http://dev.clojure.org/jira/browse/CLJ-1498) > > Removes owner-thread check from transients - this check was preventing > > some valid usage of transients in core.async where a transient is created > > on one thread and then used again in another pooled thread (while still > > maintaining thread isolation). > > > > ## 3 Bug Fixes > > > > * [CLJ-1362](http://dev.clojure.org/jira/browse/CLJ-1362) > > Reduce broken on some primitive vectors > > * [CLJ-1388](http://dev.clojure.org/jira/browse/CLJ-1388) > > Equality bug on records created with nested calls to map->record > > * [CLJ-1274](http://dev.clojure.org/jira/browse/CLJ-1274) > > Unable to set compiler options via system properties except for AOT > > compilation > > * [CLJ-1241](http://dev.clojure.org/jira/browse/CLJ-1241) > > NPE when AOTing overrided clojure.core functions > > * [CLJ-1185](http://dev.clojure.org/jira/browse/CLJ-1185) > > reductions does not check for reduced value > > * [CLJ-1039](http://dev.clojure.org/jira/browse/CLJ-1039) > > Using def with metadata {:type :anything} throws ClassCastException > > during printing > > * [CLJ-887](http://dev.clojure.org/jira/browse/CLJ-887) > > Error when calling primitive functions with destructuring in the arg > > vector > > * [CLJ-823](http://dev.clojure.org/jira/browse/CLJ-823) > > Piping seque into seque can deadlock > > * [CLJ-738](http://dev.clojure.org/jira/browse/CLJ-738) > > <= is incorrect when args include Double/NaN > > -- > You received this message because you are subscribed to the Google Groups > "Clojure Dev" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clojure-dev+unsubscr...@googlegroups.com. > To post to this group, send email to clojure-...@googlegroups.com. > Visit this group at http://groups.google.com/group/clojure-dev. > For more options, visit https://groups.google.com/d/optout. > -- 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.