README.md

# Cbuf

A [circular buffer](https://en.wikipedia.org/wiki/Circular_buffer) with implementations built on `map` and `ets`.

## Installation

```elixir
def deps do
  [
    {:cbuf, "~> 0.5"}
  ]
end
```

See the docs at [https://hexdocs.pm/cbuf](https://hexdocs.pm/cbuf) for usage information.

## Benchmarks

```
clark$> mix run bench.exs
Small N: 50
Medium N: 5000
Small N: 50000
Operating System: macOS
CPU Information: Intel(R) Core(TM) i7-4870HQ CPU @ 2.50GHz
Number of Available Cores: 8
Available memory: 16 GB
Elixir 1.6.1
Erlang 20.2.2
Benchmark suite executing with the following configuration:
warmup: 2 s
time: 5 s
parallel: 4
inputs: none specified
Estimated total run time: 7 min


Benchmarking ets count medium...
Benchmarking ets insert large...
Benchmarking map delete large...
Benchmarking map size large...
Benchmarking ets delete medium...
Benchmarking ets member? small...
Benchmarking ets to_list small...
Benchmarking ets size medium...
Benchmarking ets pop medium...
Benchmarking map empty? small...
Benchmarking map pop small...
Benchmarking map count small...
Benchmarking ets to_list large...
Benchmarking ets peek medium...
Benchmarking map insert large...
Benchmarking map empty? medium...
Benchmarking map pop large...
Benchmarking ets new medium...
Benchmarking ets to_list medium...
Benchmarking map peek medium...
Benchmarking map to_list large...
Benchmarking map delete small...
Benchmarking ets delete small...
Benchmarking ets new large...
Benchmarking ets pop large...
Benchmarking map count medium...
Benchmarking map new large...
Benchmarking ets new small...
Benchmarking ets member? medium...
Benchmarking map new small...
Benchmarking ets size large...
Benchmarking ets empty? large...
Benchmarking ets size small...
Benchmarking map member? medium...
Benchmarking ets member? large...
Benchmarking map peek large...
Benchmarking map count large...
Benchmarking ets count large...
Benchmarking ets delete large...
Benchmarking ets pop small...
Benchmarking map to_list medium...
Benchmarking map delete medium...
Benchmarking ets empty? small...
Benchmarking ets empty? medium...
Benchmarking map new medium...
Benchmarking map pop medium...
Benchmarking map member? small...
Benchmarking ets peek large...
Benchmarking map peek small...
Benchmarking ets insert medium...
Benchmarking ets count small...
Benchmarking map empty? large...
Benchmarking ets peek small...
Benchmarking map member? large...
Benchmarking map to_list small...
Benchmarking map size medium...
Benchmarking map insert small...
Benchmarking ets insert small...
Benchmarking map size small...
Benchmarking map insert medium...

Name                         ips        average  deviation         median         99th %
map empty? medium        31.22 M      0.0320 μs    ±83.97%      0.0300 μs      0.0590 μs
map size large           31.05 M      0.0322 μs    ±77.56%      0.0310 μs      0.0580 μs
ets size medium          29.83 M      0.0335 μs    ±38.91%      0.0320 μs      0.0620 μs
ets empty? large         29.49 M      0.0339 μs    ±33.61%      0.0320 μs      0.0600 μs
ets empty? small         28.71 M      0.0348 μs    ±23.05%      0.0320 μs      0.0640 μs
ets empty? medium        28.56 M      0.0350 μs    ±23.65%      0.0320 μs      0.0680 μs
ets size large           28.14 M      0.0355 μs    ±37.91%      0.0320 μs      0.0690 μs
map size medium          27.94 M      0.0358 μs    ±24.73%      0.0330 μs      0.0670 μs
map empty? large         27.68 M      0.0361 μs    ±24.58%      0.0330 μs      0.0680 μs
ets size small           27.26 M      0.0367 μs    ±99.89%      0.0340 μs      0.0690 μs
map size small           26.40 M      0.0379 μs   ±299.37%      0.0320 μs       0.100 μs
ets count medium         16.55 M      0.0604 μs    ±56.37%      0.0600 μs       0.110 μs
map count medium         15.35 M      0.0651 μs    ±64.47%      0.0600 μs       0.120 μs
map count small          15.17 M      0.0659 μs   ±288.40%      0.0600 μs       0.120 μs
map count large          15.06 M      0.0664 μs   ±105.84%      0.0600 μs       0.130 μs
ets count small          14.95 M      0.0669 μs    ±39.52%      0.0620 μs       0.130 μs
ets count large          14.94 M      0.0669 μs    ±47.91%      0.0630 μs       0.130 μs
map peek large           11.52 M      0.0868 μs    ±51.89%      0.0800 μs       0.180 μs
map peek medium          11.12 M      0.0899 μs   ±115.14%      0.0820 μs       0.190 μs
map peek small           10.96 M      0.0913 μs   ±221.72%      0.0800 μs       0.190 μs
map empty? small          6.06 M       0.165 μs   ±227.60%           0 μs           1 μs
map delete small          4.18 M        0.24 μs   ±102.60%        0.21 μs        1.89 μs
map insert small          4.14 M        0.24 μs    ±93.51%        0.21 μs        1.84 μs
map pop small             3.36 M        0.30 μs    ±79.15%        0.28 μs        0.60 μs
map delete large          3.36 M        0.30 μs  ±1653.92%        0.21 μs        1.92 μs
map delete medium         3.30 M        0.30 μs  ±1252.38%        0.25 μs        0.60 μs
map insert medium         3.14 M        0.32 μs   ±109.24%        0.24 μs        2.19 μs
map insert large          3.09 M        0.32 μs  ±1350.73%        0.30 μs        0.60 μs
map pop large             2.34 M        0.43 μs   ±809.80%        0.40 μs        0.81 μs
map pop medium            2.19 M        0.46 μs  ±1204.54%        0.30 μs        1.10 μs
ets peek medium           1.47 M        0.68 μs   ±507.39%        0.63 μs        1.20 μs
ets peek small            1.47 M        0.68 μs   ±554.57%        0.60 μs        1.30 μs
ets peek large            1.45 M        0.69 μs   ±467.56%        0.64 μs        1.30 μs
ets member? small         0.24 M        4.24 μs   ±652.64%           4 μs           8 μs
map member? small        0.169 M        5.94 μs   ±942.22%           5 μs          13 μs
ets insert small         0.156 M        6.39 μs    ±46.70%        6.40 μs       13.70 μs
ets insert medium        0.156 M        6.39 μs    ±49.78%        6.30 μs       14.40 μs
ets delete small         0.142 M        7.03 μs    ±44.53%        7.03 μs       14.50 μs
ets insert large         0.126 M        7.95 μs   ±279.23%        5.80 μs          32 μs
ets delete medium        0.121 M        8.25 μs   ±223.99%        5.70 μs          31 μs
map to_list small        0.119 M        8.40 μs   ±585.01%           7 μs          15 μs
ets delete large         0.114 M        8.77 μs   ±228.22%        6.37 μs          35 μs
map new small           0.0904 M       11.06 μs   ±404.22%           8 μs         132 μs
ets pop medium          0.0567 M       17.64 μs    ±26.31%       17.60 μs       28.60 μs
ets pop small           0.0548 M       18.27 μs   ±100.24%          17 μs          49 μs
ets pop large           0.0508 M       19.67 μs    ±93.53%          18 μs          53 μs
ets to_list small       0.0287 M       34.86 μs    ±29.46%          35 μs          43 μs
ets new small           0.0272 M       36.76 μs    ±45.14%          36 μs          57 μs
ets member? medium     0.00361 M      277.09 μs    ±17.09%         268 μs         479 μs
map member? medium     0.00228 M      437.87 μs    ±11.20%         427 μs      752.55 μs
map to_list medium     0.00122 M      821.78 μs    ±11.36%         809 μs     1429.76 μs
map new medium         0.00054 M     1851.17 μs    ±23.16%        1719 μs     3253.09 μs
ets member? large      0.00034 M     2961.39 μs    ±10.02%        2881 μs     4714.44 μs
ets new medium         0.00029 M     3476.30 μs    ±12.71%        3591 μs        4102 μs
ets to_list medium     0.00024 M     4197.38 μs    ±19.38%        3942 μs     7367.34 μs
map member? large      0.00019 M     5289.42 μs    ±16.55%        4928 μs     8199.65 μs
map to_list large      0.00007 M    15199.72 μs    ±17.11%       14783 μs    22345.60 μs
map new large          0.00004 M    25682.00 μs    ±13.82%       25314 μs    35804.93 μs
ets new large          0.00003 M    36430.22 μs    ±11.77%    36253.50 μs    45945.20 μs
ets to_list large      0.00002 M    43671.84 μs     ±7.02%       43567 μs    60286.94 μs

Comparison:
map empty? medium        31.22 M
map size large           31.05 M - 1.01x slower
ets size medium          29.83 M - 1.05x slower
ets empty? large         29.49 M - 1.06x slower
ets empty? small         28.71 M - 1.09x slower
ets empty? medium        28.56 M - 1.09x slower
ets size large           28.14 M - 1.11x slower
map size medium          27.94 M - 1.12x slower
map empty? large         27.68 M - 1.13x slower
ets size small           27.26 M - 1.15x slower
map size small           26.40 M - 1.18x slower
ets count medium         16.55 M - 1.89x slower
map count medium         15.35 M - 2.03x slower
map count small          15.17 M - 2.06x slower
map count large          15.06 M - 2.07x slower
ets count small          14.95 M - 2.09x slower
ets count large          14.94 M - 2.09x slower
map peek large           11.52 M - 2.71x slower
map peek medium          11.12 M - 2.81x slower
map peek small           10.96 M - 2.85x slower
map empty? small          6.06 M - 5.15x slower
map delete small          4.18 M - 7.47x slower
map insert small          4.14 M - 7.54x slower
map pop small             3.36 M - 9.29x slower
map delete large          3.36 M - 9.30x slower
map delete medium         3.30 M - 9.46x slower
map insert medium         3.14 M - 9.95x slower
map insert large          3.09 M - 10.10x slower
map pop large             2.34 M - 13.34x slower
map pop medium            2.19 M - 14.26x slower
ets peek medium           1.47 M - 21.23x slower
ets peek small            1.47 M - 21.30x slower
ets peek large            1.45 M - 21.57x slower
ets member? small         0.24 M - 132.29x slower
map member? small        0.169 M - 185.29x slower
ets insert small         0.156 M - 199.57x slower
ets insert medium        0.156 M - 199.64x slower
ets delete small         0.142 M - 219.59x slower
ets insert large         0.126 M - 248.15x slower
ets delete medium        0.121 M - 257.42x slower
map to_list small        0.119 M - 262.09x slower
ets delete large         0.114 M - 273.78x slower
map new small           0.0904 M - 345.23x slower
ets pop medium          0.0567 M - 550.65x slower
ets pop small           0.0548 M - 570.28x slower
ets pop large           0.0508 M - 614.11x slower
ets to_list small       0.0287 M - 1088.44x slower
ets new small           0.0272 M - 1147.63x slower
ets member? medium     0.00361 M - 8651.04x slower
map member? medium     0.00228 M - 13670.95x slower
map to_list medium     0.00122 M - 25657.40x slower
map new medium         0.00054 M - 57796.44x slower
ets member? large      0.00034 M - 92459.48x slower
ets new medium         0.00029 M - 108535.84x slower
ets to_list medium     0.00024 M - 131049.30x slower
map member? large      0.00019 M - 165144.57x slower
map to_list large      0.00007 M - 474560.63x slower
map new large          0.00004 M - 801834.66x slower
ets new large          0.00003 M - 1137411.90x slower
ets to_list large      0.00002 M - 1363507.31x slower
```