For detailed usage see our docs
OrderedCollections is a library for Elixir that provides efficient, sorted data structures:
SortedMap
and SortedSet
wrap Erlang’s :gb_trees
and :gb_sets
for easy use in Elixir.
-
SortedMap
- Insert, update, and delete key-value pairs while preserving sorted order.
- Fast lookups using
:gb_trees
- Range queries over keys.
- Conversion to standard Elixir
Map
or list.
-
SortedSet
- Maintain a set of unique elements in sorted order.
- Fast membership checks using
:gb_sets
- Union, intersection, and difference operations.
- Range queries over elements.
- Conversion to a standard Elixir
MapSet
or list.
Add ordered_collections
to your list of dependencies in mix.exs
:
def deps do
[
{:ordered_collections, "~> 0.1.1"}
]
end
Run on my local machine:
- Operating System: macOS
- CPU Information: Apple M3
- Number of Available Cores: 8
- Available memory: 16 GB
- Elixir 1.18.3
- Erlang 27.2.4
- JIT enabled: true
Operation | Structure | IPS | Average Time | Deviation | Median | 99th Percentile | Comparison |
---|---|---|---|---|---|---|---|
Delete | gb_trees | 1.11 K | 901.71 μs | ±7.36% | 885.04 μs | 1129.99 μs | — |
Delete | SortedMap | 1.02 K | 985.20 μs | ±4.89% | 972.92 μs | 1198.37 μs | 1.09× slower (+83.48 μs) |
Operation | Structure | IPS | Average Time | Deviation | Median | 99th Percentile | Comparison |
---|---|---|---|---|---|---|---|
Insert | gb_trees | 348.54 | 2.87 ms | ±12.31% | 2.85 ms | 3.71 ms | — |
Insert | SortedMap | 298.88 | 3.35 ms | ±9.82% | 3.38 ms | 4.21 ms | 1.17× slower (+0.48 ms) |
Operation | Structure | IPS | Average Time | Deviation | Median | 99th Percentile | Comparison |
---|---|---|---|---|---|---|---|
Lookup | gb_trees | 2.73 K | 366.81 μs | ±9.90% | 361.96 μs | 446.20 μs | — |
Lookup | SortedMap | 2.35 K | 425.65 μs | ±18.01% | 415.50 μs | 508.36 μs | 1.16× slower (+58.84 μs) |
Operation | Structure | IPS | Average Time | Deviation | Median | 99th Percentile | Comparison |
---|---|---|---|---|---|---|---|
Range | SortedMap | 8.85 K | 113.04 μs | ±3.73% | 112.21 μs | 130.50 μs | — |
Range | gb_trees | 8.39 K | 119.25 μs | ±32.45% | 118.08 μs | 136.58 μs | 1.05× slower (+6.20 μs) |
Range | Elixir (naive) | 5.67 K | 176.34 μs | ±12.57% | 173.63 μs | 220.07 μs | 1.56× slower (+63.29 μs) |
Operation | Structure | IPS | Average Time | Deviation | Median | 99th Percentile | Comparison |
---|---|---|---|---|---|---|---|
Delete | SortedSet | 684.77 | 1.46 ms | ±4.06% | 1.45 ms | 1.67 ms | — |
Delete | :gb_sets | 684.39 | 1.46 ms | ±4.65% | 1.46 ms | 1.68 ms | ~Same performance |
Operation | Structure | IPS | Average Time | Deviation | Median | 99th Percentile | Comparison |
---|---|---|---|---|---|---|---|
Insert | :gb_sets | 554.92 | 1.80 ms | ±7.06% | 1.80 ms | 2.15 ms | — |
Insert | SortedSet | 511.32 | 1.96 ms | ±10.78% | 1.92 ms | 2.46 ms | 1.09× slower (+0.154 ms) |
Operation | Structure | IPS | Average Time | Deviation | Median | 99th Percentile | Comparison |
---|---|---|---|---|---|---|---|
Lookup | :gb_sets | 1.68 K | 593.48 μs | ±5.98% | 586.30 μs | 708.54 μs | — |
Lookup | SortedSet | 1.62 K | 617.83 μs | ±4.29% | 614.80 μs | 742.15 μs | 1.04× slower (+24.36 μs) |