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.

Reply via email to