fast-zip
A modified version of clojure.zip that
uses deftype
internally and is written in CLJX format.
Usage
For Clojure 1.7 use:
[fast-zip "0.7.0"]
For previous versions use:
[fast-zip "0.6.1"]
This is a drop in replacement for clojure.zip. Simply require fast-zip.core
instead of clojure.zip
.
Benchmark
Since 0.6.1 a benchmark run consists of two analysis goals:
- "walk" traverses a vector zip of three levels of ints and sums the numbers (reduction over leaves)
- "edit" same setup as for "walk", but actually edits each leaf
(* n 10)
and applies all changes at the end
The current snapshot version of this lib is roughly twice as fast as the 0.5.2 release...
Historical benchmarks for each version
Clojure
To run, use lein perforate
.
WARNING: Final GC required 2.904199000536039 % of runtime
Goal: Benchmark vector zip edit.
-----
Case: :fast-zip
Evaluation count : 96600 in 60 samples of 1610 calls.
Execution time mean : 613.696756 µs
Execution time std-deviation : 23.370402 µs
Execution time lower quantile : 588.826153 µs ( 2.5%)
Execution time upper quantile : 687.558243 µs (97.5%)
Overhead used : 2.997006 ns
Found 3 outliers in 60 samples (5.0000 %)
low-severe 3 (5.0000 %)
Variance from outliers : 23.8777 % Variance is moderately inflated by outliers
Case: :clojure.zip
Evaluation count : 27420 in 60 samples of 457 calls.
Execution time mean : 2.143100 ms
Execution time std-deviation : 55.341182 µs
Execution time lower quantile : 2.046640 ms ( 2.5%)
Execution time upper quantile : 2.248948 ms (97.5%)
Overhead used : 2.997006 ns
Goal: Benchmark vector zip walk.
-----
Case: :fast-zip
Evaluation count : 578700 in 60 samples of 9645 calls.
Execution time mean : 106.602340 µs
Execution time std-deviation : 3.705304 µs
Execution time lower quantile : 101.726377 µs ( 2.5%)
Execution time upper quantile : 117.508157 µs (97.5%)
Overhead used : 2.997006 ns
Found 5 outliers in 60 samples (8.3333 %)
low-severe 2 (3.3333 %)
low-mild 3 (5.0000 %)
Variance from outliers : 20.6548 % Variance is moderately inflated by outliers
Case: :clojure.zip
Evaluation count : 46020 in 60 samples of 767 calls.
Execution time mean : 1.326133 ms
Execution time std-deviation : 32.156029 µs
Execution time lower quantile : 1.262908 ms ( 2.5%)
Execution time upper quantile : 1.387965 ms (97.5%)
Overhead used : 2.997006 ns
Found 1 outliers in 60 samples (1.6667 %)
low-severe 1 (1.6667 %)
Variance from outliers : 12.5459 % Variance is moderately inflated by outliers
ClojureScript
For the clojurescript version, make sure you have node.js installed
along with the benchmark
NPM module. Then use lein clean-bench
Benchmark: vector zip walk...
:clojure.zip.walk x 69.52 ops/sec ±3.58% (67 runs sampled)
:fast-zip.walk x 394 ops/sec ±1.88% (89 runs sampled)
Fastest is :fast-zip
Benchmark: vector zip edit...
:clojure.zip.edit x 33.89 ops/sec ±2.66% (61 runs sampled)
:fast-zip.edit x 89.38 ops/sec ±2.13% (78 runs sampled)
Fastest is :fast-zip.edit
TODO
- Create benchmarks that represent more functionality and different use cases (in progress)
Contributors
Thanks to
- Brandon Bloom for his advice.
- Zach Tellman
- Joel Holdbrooks for the ClojureScript version.
- David Thomas Hume
- Karsten Schmidt (CLJX restructure, cljc restructure, deftype impl & benchmark updates)
License
Distributed under the Eclipse Public License, the same as Clojure.