use reduce-kv to optimize ALL transform on maps, significant performance boost

This commit is contained in:
Nathan Marz 2016-06-01 11:08:49 -04:00
parent 2aff955a99
commit 6b7d18d874
2 changed files with 10 additions and 1 deletions

View file

@ -1,5 +1,6 @@
## 0.11.1 (unreleased)
* More efficient inline caching for Clojure version, now inline caching is always within 5% of manually precompiled code
* Significant performance improvement for ALL transform on maps for Clojure version (25% on simple benchmarks)
## 0.11.0
* New `path` macro does intelligent inline caching of the provided path. The path is factored into a static portion and into params which may change on each usage of the path (e.g. local parameters). The static part is factored and compiled on the first run-through, and then re-used for all subsequent invocations. As an example, `[ALL (keypath k)]` is factored into `[ALL keypath]`, which is compiled and cached, and `[k]`, which is provided on each execution. If it is not possible to precompile the path (e.g. [ALL some-local-variable]), nothing is cached and the path will be compiled on each run-through.

View file

@ -553,7 +553,15 @@
(doall (map next-fn structure))
(map? structure)
(->> structure (r/map vec) (r/map next-fn) (into empty-structure))
;; reduce-kv is much faster than doing r/map through call to (into ...)
(reduce-kv
(fn [m k v]
(let [[newk newv] (next-fn [k v])]
(assoc m newk newv)
))
empty-structure
structure
)
:else
(->> structure (r/map next-fn) (into empty-structure))