fast-assoc-in
- usesfast-assoc
andval-at
directlyfast-updatge-in
- same asfast-assoc-in
.definline
- likedefinline
but supports multiple arities
- Complete rewrite
- Run with JMH
- Results measure throughput and % improvement
- Bug in assoc-in where values are false-y
- Variadic arity assoc-in. The analysis collapses all paths to a tree with leaves being the values to be assoc-ed and plans out a minimal execution. Also see #23
- Not found arity to inline/get-in
- Tests from Clojure's test suit to catch some edge cases
- Faster update-in which takes advantage of variadic arities, but introduces ugly code duplication
- Faster versions of subseq/rsubseq which don't use sets for checking test functions identity.
- Static merge in
fast-map-merge
. as
macro for annotating symbols.- Box operations which mimic atom and volatile semantics.
update-in->
similar to update-in but takes many arguments.kvreduce
- dispatches directly toIKVReduce
.kvreduce()
method instead of going through a protocol.- Add
fast-count
. - Add
short-circuiting-merge
which returns a merge function which short circuits according tocount-fn
withmerge-fn
. - Add
def-short-circuiting-merge
as convenience wrapper aroundshort-circuiting-merge
for def-ing named functions.
- inline/get not-found arity allowed any number of arguments, explicitly changed to one. #24
- Fix callsite analysis of quoted forms. Now functions calls and quoted forms are handled correctly.
- inline/assoc-in new implementation did not extract bindings. Fixing this allows using side-effecting functions as keys
- Found an edge-case with adding type hints on inline args - literals would lose their inferred types and cause reflection warnings by taking on the meta. Narrowed down to cover only symbols.
- Relax the constraints in extract-bindings, making it less aggressive but still correct.
- Remove fn allocation in
fast-map-merge
. - Change
fast-map-merge
todefinline
. - Use
kvreduce
instead ofreduce-kv
infast-map-merge
.
- Add Circlci integration
- Unrolled inline dissoc fo
& ks
- Static merge case. If the map is written explicitly it can be
assoc
ed instead ofconj
ed. Closes #6 dissoc-in
.get
andnth
macros.- inline Clojure core implementations as drop in replacements.
- Not found arity to core/val-at
- Not found arity to concurrent-map/get
- Correct inline implementation of
select-keys
. map/get
which doesn't check input satisfiesMap
.
- Broken test due to name change (memoize-h)
- rmerge not supporting collections not implementing IKVReduce (#1 (comment))
- Clean up type hints around collections wrappers.
- Rename
concurrent-hash-map?
->concurrent-map?
- Rename
select-keys
->fast-select-keys
. - Rename
map/get
->map/get?
. - Use
doto
inmap/put
.
- basic tests, so we can sleep better.
- Relax the constraints on the possible values of keys during inline analysis. previously, only strings, keywords, symbols and integers were allowed, now all types are allowed. The only constraint is that the argument is a sequences or resolveable at compile time.
- Add bindings for arguments which look like sequences around
lens/put
andlens/update
, as they appear more than once, and if they involve some heavy computation or side effects they should not be run more than once. - Change / Fix how memoization worked for nullary functions. Now the
result is just cached in an atom. Have to guard against a function
returning
nil
with a sentinel value.
- memoize nil values: Need to use sentinel values in the java maps to indicate nil return values from the invoked function.
- Reorganize namespaces and file structure:
- clj-fast
- core: low level functions operating directly on Clojure data structures and Metosin functions
- inline: inline implementations of core Clojure functions
- lens: macro implementations of lenses
- util: utility functions used as by macros.
- collections
- hash-map: functions to operate directly on hash maps
- concurrent-hash-map: functions to operate directly on concurrent hash map
- clj-fast
- Add slow benchmarking option to benchmarks namespaces.
- memoize implementations and benchmarks
- Complete rewrite of benchmark suit.
- Complete rewrite of results details.
- transient implementation for merge (Joinr)
- more profile cases
- pre check to inline-update-in
- Usage in README
- fast-get-in-th
- defrec->inline-select-keys and its utility functions
- fast-select-keys-inline to inline-select-keys