README.md

# Cbuf

A [circular buffer](https://en.wikipedia.org/wiki/Circular_buffer) based on Erlang's `array` module.

## Installation

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

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

## Benchmarks

```
clark$> mix run bench.exs
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: 1
inputs: none specified
Estimated total run time: 3.73 min


Benchmarking count large...
Benchmarking count medium...
Benchmarking count small...
Benchmarking count xlarge...
Benchmarking delete large...
Benchmarking delete medium...
Benchmarking delete small...
Benchmarking delete xlarge...
Benchmarking insert large...
Benchmarking insert medium...
Benchmarking insert small...
Benchmarking insert xlarge...
Benchmarking new large...
Benchmarking new medium...
Benchmarking new small...
Benchmarking new xlarge...
Benchmarking peek large...
Benchmarking peek medium...
Benchmarking peek small...
Benchmarking peek xlarge...
Benchmarking pop large...
Benchmarking pop medium...
Benchmarking pop small...
Benchmarking pop xlarge...
Benchmarking size large...
Benchmarking size medium...
Benchmarking size small...
Benchmarking size xlarge...
Benchmarking to_list large...
Benchmarking to_list medium...
Benchmarking to_list small...
Benchmarking to_list xlarge...

Name                     ips        average  deviation         median         99th %
size small           35.96 M      0.0278 μs    ±19.55%      0.0270 μs      0.0490 μs
size xlarge          35.69 M      0.0280 μs    ±21.38%      0.0260 μs      0.0550 μs
size large           35.50 M      0.0282 μs    ±20.39%      0.0260 μs      0.0550 μs
size medium          35.44 M      0.0282 μs    ±49.85%      0.0260 μs      0.0550 μs
count large          18.33 M      0.0546 μs    ±14.28%      0.0530 μs      0.0870 μs
count medium         18.09 M      0.0553 μs    ±18.69%      0.0530 μs       0.102 μs
count small          17.94 M      0.0558 μs    ±18.93%      0.0520 μs       0.109 μs
count xlarge         17.87 M      0.0560 μs    ±18.05%      0.0530 μs       0.107 μs
peek large           17.26 M      0.0580 μs    ±13.58%      0.0560 μs      0.0900 μs
peek medium          17.20 M      0.0582 μs    ±16.12%      0.0560 μs       0.114 μs
peek small           16.90 M      0.0592 μs    ±24.04%      0.0560 μs       0.115 μs
peek xlarge          16.82 M      0.0595 μs    ±16.12%      0.0560 μs       0.105 μs
new small             9.28 M       0.108 μs   ±264.78%       0.100 μs        0.27 μs
new medium            7.84 M       0.128 μs   ±262.63%       0.120 μs        0.30 μs
new large             6.87 M       0.146 μs   ±134.53%       0.140 μs        0.33 μs
new xlarge            6.14 M       0.163 μs   ±113.47%       0.150 μs        0.34 μs
delete small          5.10 M       0.196 μs    ±44.97%       0.180 μs        0.46 μs
insert small          5.07 M       0.197 μs    ±92.47%       0.190 μs        0.39 μs
pop small             3.26 M        0.31 μs  ±2120.34%        0.30 μs        0.60 μs
insert medium         2.89 M        0.35 μs  ±1651.24%        0.30 μs        0.70 μs
delete medium         2.84 M        0.35 μs  ±1494.52%        0.30 μs        0.70 μs
pop medium            2.41 M        0.42 μs  ±1021.78%        0.40 μs        0.90 μs
insert large          2.19 M        0.46 μs   ±813.01%        0.40 μs        0.90 μs
delete large          2.12 M        0.47 μs  ±1086.66%        0.40 μs        1.20 μs
pop large             1.86 M        0.54 μs   ±724.16%        0.50 μs        1.40 μs
insert xlarge         1.77 M        0.56 μs   ±706.75%        0.50 μs        1.40 μs
delete xlarge         1.73 M        0.58 μs   ±826.02%        0.50 μs        1.40 μs
pop xlarge            1.56 M        0.64 μs   ±537.68%        0.60 μs        1.60 μs
to_list small         1.03 M        0.97 μs  ±6093.68%           1 μs           2 μs
to_list medium       0.123 M        8.12 μs   ±463.24%           7 μs          18 μs
to_list large       0.0105 M       95.39 μs    ±19.77%          90 μs         174 μs
to_list xlarge     0.00076 M     1313.43 μs    ±18.87%        1243 μs     2242.16 μs

Comparison:
size small           35.96 M
size xlarge          35.69 M - 1.01x slower
size large           35.50 M - 1.01x slower
size medium          35.44 M - 1.01x slower
count large          18.33 M - 1.96x slower
count medium         18.09 M - 1.99x slower
count small          17.94 M - 2.00x slower
count xlarge         17.87 M - 2.01x slower
peek large           17.26 M - 2.08x slower
peek medium          17.20 M - 2.09x slower
peek small           16.90 M - 2.13x slower
peek xlarge          16.82 M - 2.14x slower
new small             9.28 M - 3.87x slower
new medium            7.84 M - 4.58x slower
new large             6.87 M - 5.24x slower
new xlarge            6.14 M - 5.85x slower
delete small          5.10 M - 7.05x slower
insert small          5.07 M - 7.09x slower
pop small             3.26 M - 11.05x slower
insert medium         2.89 M - 12.47x slower
delete medium         2.84 M - 12.67x slower
pop medium            2.41 M - 14.93x slower
insert large          2.19 M - 16.42x slower
delete large          2.12 M - 17.00x slower
pop large             1.86 M - 19.30x slower
insert xlarge         1.77 M - 20.27x slower
delete xlarge         1.73 M - 20.80x slower
pop xlarge            1.56 M - 23.07x slower
to_list small         1.03 M - 34.87x slower
to_list medium       0.123 M - 291.83x slower
to_list large       0.0105 M - 3430.22x slower
to_list xlarge     0.00076 M - 47232.59x slower
```