All credit to Francis for the reduce patch! The perf win is really great.

Re: IReduce – thanks, indeed, I forgot about the special-casing in reduce.
I guess I'll tweak that for the next release.

Incidentally, I notice I left out the final result in the after-patch 1.5.1
benchmark run in the previous email – repeated below in full.

Cheers,
Michał


After patch, Clojure 1.5.1:

user> (let [m1 (apply sorted-map (range 10000))
            m2 (apply avl/sorted-map (range 10000))]
        (assert (= (reduce (fn [out kv] (+ out (key kv) (val kv)))
                     0
                     m1)
                   (reduce (fn [out kv] (+ out (key kv) (val kv)))
                     0
                     m2)))
        (c/quick-bench
          (reduce (fn [out kv] (+ out (key kv) (val kv)))
            0
            m1))
        (c/quick-bench
          (reduce (fn [out kv] (+ out (key kv) (val kv)))
            0
            m2)))
Evaluation count : 990 in 6 samples of 165 calls.
             Execution time mean : 599.205620 µs
    Execution time std-deviation : 30.389791 µs
   Execution time lower quantile : 579.132582 µs ( 2.5%)
   Execution time upper quantile : 650.985417 µs (97.5%)
                   Overhead used : 1.320107 ns

Found 1 outliers in 6 samples (16.6667 %)
        low-severe       1 (16.6667 %)
 Variance from outliers : 13.8889 % Variance is moderately inflated by outliers
Evaluation count : 3198 in 6 samples of 533 calls.
             Execution time mean : 191.906227 µs
    Execution time std-deviation : 3.447964 µs
   Execution time lower quantile : 188.550574 µs ( 2.5%)
   Execution time upper quantile : 197.006475 µs (97.5%)
                   Overhead used : 1.320107 ns
nil


On 23 August 2016 at 02:59, Alex Miller <a...@puredanger.com> wrote:

> Nice work! Esp on the reduce stuff - great to see that. Any reason you
> didn't go the IReduce path in Clojure too instead of CollReduce? Generally,
> I'd say that's preferred when you control the data structure.
>
>
> On Monday, August 22, 2016 at 7:43:51 PM UTC-5, Michał Marczyk wrote:
>>
>> Hi,
>>
>> I am pleased to announce the 0.0.14 release of data.avl, a Clojure
>> Contrib library providing highly performant drop-in replacements for
>> Clojure(Script)'s built-in sorted maps and sets that support O(log n)
>> nth, rank-of, first-class submaps/subsets (like subseq, but preserving
>> collection type; fully independent from the original for GC purposes)
>> and splits by key and index.
>>
>>   [org.clojure/data.avl "0.0.14"]
>>
>>   <dependency>
>>     <groupId>org.clojure</groupId>
>>     <artifactId>data.avl</artifactId>
>>     <version>0.0.14</version>
>>   </dependency>
>>
>>   org.clojure:data.avl:0.0.14
>>
>> Changes in this release:
>>
>>  1. http://dev.clojure.org/jira/browse/DAVL-8
>>
>>     Fixed a bug in split-key that caused incorrect rank and size
>>     information to be stored in some collections resulting from splits
>>     using a key absent from the input collection. See the ticket for a
>>     more detailed post mortem and links to fixing commits.
>>
>>     Many thanks to Darrick Wiebe for the report and test.check
>>     properties that exposed broken split-key return values!
>>
>>  2. http://dev.clojure.org/jira/browse/DAVL-7
>>
>>     data.avl maps and sets now implement CollReduce (in Clojure) /
>>     IReduce (in ClojureScript), leading to significantly improved
>>     reduce performance on data.avl inputs. See end of this email for
>>     some Criterium benchmarks.
>>
>>     Many thanks to Francis Avila for providing the patch!
>>
>>  3. Seqs over data.avl collections can now be = to j.u.Lists.
>>
>>  4. data.avl collections now have their own print-dup implementations
>>     that correctly round-trip in Clojure.
>>
>>  5. Public Vars in the clojure.data.avl namespace now carry :added
>>     metadata.
>>
>> Cheers,
>> Michał
>>
>>
>> Reduce benchmarks:
>> ==================
>>
>> Before patch:
>> -------------
>>
>> user> (let [m1 (apply sorted-map (range 10000))
>>             m2 (apply avl/sorted-map (range 10000))]
>>         (assert (= (reduce (fn [out kv] (+ out (key kv) (val kv)))
>>                      0
>>                      m1)
>>                    (reduce (fn [out kv] (+ out (key kv) (val kv)))
>>                      0
>>                      m2)))
>>         (c/quick-bench
>>           (reduce (fn [out kv] (+ out (key kv) (val kv)))
>>             0
>>             m1))
>>         (c/quick-bench
>>           (reduce (fn [out kv] (+ out (key kv) (val kv)))
>>             0
>>             m2)))
>> Evaluation count : 120 in 6 samples of 20 calls.
>>              Execution time mean : 663.862017 µs
>>     Execution time std-deviation : 9.483652 µs
>>    Execution time lower quantile : 654.277800 µs ( 2.5%)
>>    Execution time upper quantile : 677.885431 µs (97.5%)
>>                    Overhead used : 21.423458 ns
>> Evaluation count : 468 in 6 samples of 78 calls.
>>              Execution time mean : 1.295972 ms
>>     Execution time std-deviation : 74.233890 µs
>>    Execution time lower quantile : 1.255853 ms ( 2.5%)
>>    Execution time upper quantile : 1.420871 ms (97.5%)
>>                    Overhead used : 21.423458 ns
>>
>> Found 1 outliers in 6 samples (16.6667 %)
>> low-severe 1 (16.6667 %)
>>  Variance from outliers : 14.4619 % Variance is moderately inflated by
>> outliers
>> nil
>>
>>
>> After patch:
>> ------------
>>
>> ;;; Clojure 1.9-alpha10
>>
>> user> (let [m1 (apply sorted-map (range 10000))
>>             m2 (apply avl/sorted-map (range 10000))]
>>         (assert (= (reduce (fn [out kv] (+ out (key kv) (val kv)))
>>                      0
>>                      m1)
>>                    (reduce (fn [out kv] (+ out (key kv) (val kv)))
>>                      0
>>                      m2)))
>>         (c/quick-bench
>>           (reduce (fn [out kv] (+ out (key kv) (val kv)))
>>             0
>>             m1))
>>         (c/quick-bench
>>           (reduce (fn [out kv] (+ out (key kv) (val kv)))
>>             0
>>             m2)))
>> Evaluation count : 882 in 6 samples of 147 calls.
>>              Execution time mean : 687.923681 µs
>>     Execution time std-deviation : 17.527428 µs
>>    Execution time lower quantile : 669.270395 µs ( 2.5%)
>>    Execution time upper quantile : 710.828484 µs (97.5%)
>>                    Overhead used : 2.633678 ns
>> Evaluation count : 2940 in 6 samples of 490 calls.
>>              Execution time mean : 207.386184 µs
>>     Execution time std-deviation : 7.420049 µs
>>    Execution time lower quantile : 202.829682 µs ( 2.5%)
>>    Execution time upper quantile : 219.880774 µs (97.5%)
>>                    Overhead used : 2.633678 ns
>>
>> Found 1 outliers in 6 samples (16.6667 %)
>> low-severe 1 (16.6667 %)
>>  Variance from outliers : 13.8889 % Variance is moderately inflated by
>> outliers
>> nil
>>
>> ;;; Clojure 1.5.1
>>
>> user> (let [m1 (apply sorted-map (range 10000))
>>             m2 (apply avl/sorted-map (range 10000))]
>>         (assert (= (reduce (fn [out kv] (+ out (key kv) (val kv)))
>>                      0
>>                      m1)
>>                    (reduce (fn [out kv] (+ out (key kv) (val kv)))
>>                      0
>>                      m2)))
>>         (c/quick-bench
>>           (reduce (fn [out kv] (+ out (key kv) (val kv)))
>>             0
>>             m1))
>>         (c/quick-bench
>>           (reduce (fn [out kv] (+ out (key kv) (val kv)))
>>             0
>>             m2)))
>> Evaluation count : 990 in 6 samples of 165 calls.
>>              Execution time mean : 599.205620 µs
>>     Execution time std-deviation : 30.389791 µs
>>    Execution time lower quantile : 579.132582 µs ( 2.5%)
>>    Execution time upper quantile : 650.985417 µs (97.5%)
>>                    Overhead used : 1.320107 ns
>>
>> --
> 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.
>

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