Persistent Vector for Elixir
PersistentVector
is an array-like collection of values indexed by contiguous 0-based integer index.
PersistentVector
optimizes the following operations:
- Get element count
- Lookup element by index
- Update element by index
- Adding new element to the end
- Removing element from the end
- Enumeration
Get count operation is O(1)
, most others are O(log32(N))
.
PersistentVector
is implemented as a trie with 32-way branching at each level and uses structural sharing for updates.
All ideas are borrowed directly from Clojure
, yet the implementation (and all the bugs) are my own.
Benchmarks
Perf-wise, the sweet spot for PersistentVector
is scenarios when vector needs to be built by repeatedly appending to the end AND random-access (get
/set
operations) are also used.
If random-access after building is not required, then building and reversing a List
is more efficient.
If building speed is not important, but removal from the end happens often, then Erlang’s :array
shows better performance.
get
/set
operations perform similar to :array
:
-
PersistentVector.get/2
is slightly faster for larger collections compared to:array
. -
PersistentVector.set/3
is slightly faster for smaller collections compared to:array
.
More info
See Benchmarks