And the performance boost is just to avoid the list creation in the variadic argument?
Alex Miller <a...@puredanger.com> writes: > Most Clojure core functions unroll to 3 or 4, really just depends how much > of the tail you think is worth picking up. I don't think we have any hard > and fast rule on it. > > On Monday, October 27, 2014 2:23:15 AM UTC-5, Phillip Lord wrote: >> >> >> I am curious, with path CLJ-1430 why stop at 3 arguments? Why not unroll >> to 20? >> >> I ask for a practical reason. In my own library, I have unrolled several >> functions which get called >> a lot. Moving from all variadic to non-variadic up to 5 args has produced >> a given a 2x increase in >> my code under extreme circumstances. I was thinking of macro'ing it out to >> an arity of 20, but >> haven't yet, just because it seems a step too far. >> >> Phil >> >> >> ________________________________________ >> From: clo...@googlegroups.com <javascript:> [clo...@googlegroups.com >> <javascript:>] on behalf of Alex Miller [al...@puredanger.com >> <javascript:>] >> Sent: 27 October 2014 03:42 >> To: clo...@googlegroups.com <javascript:>; cloju...@googlegroups.com >> <javascript:> >> Subject: [ANN] Clojure 1.7.0-alpha3 now available >> >> Clojure 1.7.0-alpha3 is now available. >> >> Try it via >> - Download: >> http://central.maven.org/maven2/org/clojure/clojure/1.7.0-alpha3/ >> - Download securely: >> https://repo1.maven.org/maven2/org/clojure/clojure/1.7.0-alpha3/ >> - Leiningen: [org.clojure/clojure "1.7.0-alpha3"] >> >> For users of Clojure 1.7.0-alpha2, there have been a few important changes >> in features under development: >> >> Transducers: >> - "iteration" function renamed to "eduction" >> - Fixed several issues related to reduced values >> >> *unchecked-math* boxed math warnings: >> - warnings are now only emitted when (set! *unchecked-math* >> :warn-on-boxed). for old behavior (no warnings), use (set! *unchecked-math* >> true). >> >> For other changes new in alpha3, see the issues marked "(alpha3)" in the >> changes below. >> >> ------------------------------------------------------------ >> Clojure 1.7.0-alpha3 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://clojure.org/transducers >> >> 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) >> * eduction - returns a reducible/seqable/iterable seq of applications of >> the transducer to items in coll. Applications are re-performed with every >> reduce/seq/iterator. >> * 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 related issues addressed during development: >> * [CLJ-1511](http://dev.clojure.org/jira/browse/CLJ-1511) >> * [CLJ-1497](http://dev.clojure.org/jira/browse/CLJ-1497) >> * [CLJ-1549](http://dev.clojure.org/jira/browse/CLJ-1549) (alpha3) >> * [CLJ-1537](http://dev.clojure.org/jira/browse/CLJ-1537) (alpha3) >> >> ### 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 set to :warn-on-boxed (any truthy value will enable unchecked-math, only >> this specific value enables the warning). >> >> Example use: >> >> user> (defn plus-2 [x] (+ x 2)) ;; no warning, but boxed >> #'user/plus-2 >> user> (set! *unchecked-math* :warn-on-boxed) >> 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) >> * [CLJ-1535](http://dev.clojure.org/jira/browse/CLJ-1535) (alpha3) >> >> ### 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 >> * [CLJ-1297](http://dev.clojure.org/jira/browse/CLJ-1297) (alpha3) >> Give more specific hint if namespace with "-" not found to check file >> uses "_" >> >> ### 2.2 Documentation strings >> >> * [CLJ-1417](http://dev.clojure.org/jira/browse/CLJ-1417) (alpha3) >> clojure.java.io/input-stream<http://clojure.java.io/input-stream> has >> incorrect docstring >> * [CLJ-1357](http://dev.clojure.org/jira/browse/CLJ-1357) (alpha3) >> Fix typo in gen-class doc-string >> * [CLJ-1479](http://dev.clojure.org/jira/browse/CLJ-1479) (alpha3) >> Fix typo in filterv example >> * [CLJ-1480](http://dev.clojure.org/jira/browse/CLJ-1480) (alpha3) >> Fix typo in defmulti docstring >> * [CLJ-1477](http://dev.clojure.org/jira/browse/CLJ-1477) (alpha3) >> Fix typo in deftype docstring >> * [CLJ-1478](http://dev.clojure.org/jira/browse/CLJ-1378) (alpha3) >> Fix typo in clojure.main usage >> >> ### 2.3 Performance >> >> * [CLJ-1430](http://dev.clojure.org/jira/browse/CLJ-1430 >> <http://www.google.com/url?q=http%3A%2F%2Fdev.clojure.org%2Fjira%2Fbrowse%2FCLJ-1430&sa=D&sntz=1&usg=AFQjCNHchsdAYlVCq1vKTSyZYoGRbdBn6g>) >> >> 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). >> * [CLJ-803](http://dev.clojure.org/jira/browse/CLJ-803) (alpha3) >> Extracted IAtom interface implemented by Atom. >> * [CLJ-1315](http://dev.clojure.org/jira/browse/CLJ-1315) (alpha3) >> Don't initialize classes when importing them >> * [CLJ-1330](http://dev.clojure.org/jira/browse/CLJ-1330) (alpha3) >> Class name clash between top-level functions and defn'ed ones >> >> ## 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 >> * [CLJ-1408](http://dev.clojure.org/jira/browse/CLJ-1408) (alpha3) >> Make cached string value of Keyword and Symbol transient >> * [CLJ-1466](http://dev.clojure.org/jira/browse/CLJ-1466) (alpha3) >> clojure.core/bean should implement Iterable >> >> >> >> >> -- >> You received this message because you are subscribed to the Google >> Groups "Clojure" group. >> To post to this group, send email to clo...@googlegroups.com <javascript:> >> Note that posts from new members are moderated - please be patient with >> your first post. >> To unsubscribe from this group, send email to >> clojure+u...@googlegroups.com <javascript:> >> 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+u...@googlegroups.com <javascript:><mailto: >> clojure+unsubscr...@googlegroups.com <javascript:>>. >> For more options, visit https://groups.google.com/d/optout. >> -- Phillip Lord, Phone: +44 (0) 191 222 7827 Lecturer in Bioinformatics, Email: phillip.l...@newcastle.ac.uk School of Computing Science, http://homepages.cs.ncl.ac.uk/phillip.lord Room 914 Claremont Tower, skype: russet_apples Newcastle University, twitter: phillord NE1 7RU -- 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.