I said this already on twitter, but I see heavy (5-10x slower) perf 
regressions on my benchmark suite from 1.7-alpha5 vs 1.6. I am trying the 
other alphas now - I have a comprehensive benchmark suite that takes 4 
hours or so to run, and it's a bit backed up right now (I only have one box 
to run it on). I'm also going to point YourKit at 1.7-alpha5 soon on the 
worst regressing benchmarks (not all of them have such heavy regressions, 
and a few benchmarks are dramatically faster) and see what happens - will 
report back here once I have something more to say.

On Saturday, 10 January 2015 15:37:04 UTC, Alex Miller wrote:
>
> Clojure 1.7.0-alpha5 is now available.
>
> Try it via
> - Download: 
> https://repo1.maven.org/maven2/org/clojure/clojure/1.7.0-alpha5/
> - Leiningen: [org.clojure/clojure "1.7.0-alpha5"]
>
> A few of the highlights in alpha5:
>
> 1) New transducer arities for map-indexed, distinct, and interpose.
> The transducer versions are generally faster than the sequence versions.
> See CLJ-1601 for more details.
>
> 2) The set and vec functions should now be faster in many cases. Some of 
> the
> vec improvements will not kick in until CLJ-1499 is committed in the 
> future.
> See CLJ-1546 and CLJ-1618 for more details.
>
> 3) Two particularly troublesome AOT classloading bugs have been addressed 
> - 
> CLJ-979 and CLJ-1544. Many other tickets were found to be duplicates of 
> one of
> these as well. Big thanks to Nicola Mometto for doing the hard work on 
> debugging and providing fixes for these.
>
> For all changes new in alpha5, see the issues marked "(alpha5)" in the
> full changes below.
>
> ------------------------------------------------------------
> Clojure 1.7.0-alpha5 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
> * map-indexed (alpha5)
> * distinct (alpha5)
> * interpose (alpha5)
>
> 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)
> * [CLJ-1537](http://dev.clojure.org/jira/browse/CLJ-1537)
> * [CLJ-1554](http://dev.clojure.org/jira/browse/CLJ-1554)
> * [CLJ-1601](http://dev.clojure.org/jira/browse/CLJ-1601) (alpha5)
> * [CLJ-1606](http://dev.clojure.org/jira/browse/CLJ-1606) (alpha5)
> * [CLJ-1621](http://dev.clojure.org/jira/browse/CLJ-1621) (alpha5)
> * [CLJ-1600](http://dev.clojure.org/jira/browse/CLJ-1600) (alpha5)
>
> ### 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)
>
> ### 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)
>   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)
>   clojure.java.io/input-stream has incorrect docstring
> * [CLJ-1357](http://dev.clojure.org/jira/browse/CLJ-1357)
>   Fix typo in gen-class doc-string
> * [CLJ-1479](http://dev.clojure.org/jira/browse/CLJ-1479)
>   Fix typo in filterv example
> * [CLJ-1480](http://dev.clojure.org/jira/browse/CLJ-1480)
>   Fix typo in defmulti docstring
> * [CLJ-1477](http://dev.clojure.org/jira/browse/CLJ-1477)
>   Fix typo in deftype docstring
> * [CLJ-1478](http://dev.clojure.org/jira/browse/CLJ-1378)
>   Fix typo in clojure.main usage
>
> ### 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
> * [CLJ-1529](http://dev.clojure.org/jira/browse/CLJ-1529)
>   Reduce compile times by avoiding unnecessary calls to Class.forName()
> * [CLJ-1546](http://dev.clojure.org/jira/browse/CLJ-1546) (alpha5)
>   vec is now faster on almost all inputs
> * [CLJ-1618](http://dev.clojure.org/jira/browse/CLJ-1618) (alpha5)
>   set is now faster on almost all inputs
>
> ### 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)
>   Extracted IAtom interface implemented by Atom.
> * [CLJ-1315](http://dev.clojure.org/jira/browse/CLJ-1315)
>   Don't initialize classes when importing them
> * [CLJ-1330](http://dev.clojure.org/jira/browse/CLJ-1330)
>   Class name clash between top-level functions and defn'ed ones
> * [CLJ-1349](http://dev.clojure.org/jira/browse/CLJ-1349)
>   Update to latest test.generative and add dependency on test.check
> * [CLJ-1546](http://dev.clojure.org/jira/browse/CLJ-1546) (alpha5)
>   vec now works with things that only implement Iterable or IReduceInit
> * [CLJ-1618](http://dev.clojure.org/jira/browse/CLJ-1618) (alpha5)
>   set now works with things that only implement Iterable or IReduceInit
> * [CLJ-1633](http://dev.clojure.org/jira/browse/CLJ-1633) (alpha5)
>   PersistentList/creator doesn't handle ArraySeqs correctly
>
> ## 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)
>   Make cached string value of Keyword and Symbol transient
> * [CLJ-1466](http://dev.clojure.org/jira/browse/CLJ-1466)
>   clojure.core/bean should implement Iterable
> * [CLJ-1578](http://dev.clojure.org/jira/browse/CLJ-1578)
>   Make refer of Clojure core function not throw exception on reload
> * [CLJ-1501](http://dev.clojure.org/jira/browse/CLJ-1501)
>   LazySeq equals() should not use equiv() logic
> * [CLJ-1572](http://dev.clojure.org/jira/browse/CLJ-1572) (alpha5)
>   into (and other fns that rely on reduce) require only IReduceInit
> * [CLJ-1619](http://dev.clojure.org/jira/browse/CLJ-1619) (alpha5)
>   PersistentVector now directly implements reduce without init
> * [CLJ-1580](http://dev.clojure.org/jira/browse/CLJ-1580) (alpha5)
>   Transient collections should guarantee thread visibility
> * [CLJ-1590](http://dev.clojure.org/jira/browse/CLJ-1590) (alpha5)
>   Some IReduce/IReduceInit implementors don't respect reduced
> * [CLJ-979](http://dev.clojure.org/jira/browse/CLJ-979) (alpha5)
>   Clojure resolves to wrong deftype classes when AOT compiling or reloading
> * [CLJ-1544](http://dev.clojure.org/jira/browse/CLJ-1544) (alpha5)
>   AOT bug involving namespaces loaded before AOT compilation started
>

-- 
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