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: 4.20 min


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

Name                     ips        average  deviation         median         99th %
empty? large         38.24 M      0.0262 μs    ±21.57%      0.0250 μs      0.0520 μs
empty? medium        35.86 M      0.0279 μs    ±22.63%      0.0260 μs      0.0530 μs
empty? small         35.62 M      0.0281 μs    ±29.00%      0.0250 μs      0.0530 μs
empty? xlarge        34.99 M      0.0286 μs    ±24.36%      0.0260 μs      0.0540 μs
size small           33.40 M      0.0299 μs    ±24.13%      0.0270 μs      0.0560 μs
size large           33.16 M      0.0302 μs    ±35.87%      0.0280 μs      0.0570 μs
size medium          32.97 M      0.0303 μs    ±23.66%      0.0280 μs      0.0560 μs
size xlarge          30.64 M      0.0326 μs    ±28.85%      0.0280 μs      0.0670 μs
count small          18.31 M      0.0546 μs    ±79.30%      0.0500 μs       0.110 μs
count medium         18.12 M      0.0552 μs    ±20.86%      0.0510 μs       0.107 μs
count xlarge         17.52 M      0.0571 μs    ±20.70%      0.0520 μs       0.108 μs
count large          17.50 M      0.0572 μs    ±21.15%      0.0530 μs       0.108 μs
peek medium          16.58 M      0.0603 μs    ±20.14%      0.0550 μs       0.116 μs
peek small           16.49 M      0.0606 μs    ±19.77%      0.0560 μs       0.116 μs
peek xlarge          16.40 M      0.0610 μs    ±20.37%      0.0560 μs       0.116 μs
peek large           16.16 M      0.0619 μs    ±20.59%      0.0570 μs       0.116 μs
new small             9.01 M       0.111 μs   ±317.36%       0.100 μs        0.30 μs
new medium            7.54 M       0.133 μs   ±247.05%       0.120 μs        0.39 μs
new large             6.49 M       0.154 μs   ±131.39%       0.140 μs        0.42 μs
new xlarge            5.87 M       0.171 μs   ±131.54%       0.160 μs        0.41 μs
delete small          4.82 M        0.21 μs    ±77.09%       0.190 μs        0.49 μs
insert small          4.67 M        0.21 μs    ±94.16%        0.20 μs        0.42 μs
pop small             3.10 M        0.32 μs  ±1563.27%        0.30 μs        0.70 μs
insert medium         2.82 M        0.36 μs  ±1644.08%        0.30 μs        0.70 μs
delete medium         2.81 M        0.36 μs  ±1553.59%        0.30 μs        0.70 μs
pop medium            2.44 M        0.41 μs  ±1052.78%        0.40 μs        0.80 μs
insert large          2.13 M        0.47 μs   ±797.70%        0.40 μs        1.30 μs
delete large          2.11 M        0.47 μs  ±1199.73%        0.40 μs        1.20 μs
pop large             1.88 M        0.53 μs   ±758.25%        0.50 μs        1.40 μs
delete xlarge         1.72 M        0.58 μs   ±831.95%        0.50 μs        1.50 μs
insert xlarge         1.71 M        0.59 μs   ±671.17%        0.50 μs        1.50 μs
pop xlarge            1.55 M        0.64 μs   ±521.96%        0.60 μs        1.60 μs
to_list small         1.30 M        0.77 μs   ±510.96%        0.70 μs        1.60 μs
to_list medium       0.122 M        8.19 μs   ±501.09%           7 μs          17 μs
to_list large       0.0104 M       96.18 μs    ±20.19%          89 μs         184 μs
to_list xlarge     0.00080 M     1254.46 μs    ±18.61%        1188 μs     2248.17 μs

Comparison:
empty? large         38.24 M
empty? medium        35.86 M - 1.07x slower
empty? small         35.62 M - 1.07x slower
empty? xlarge        34.99 M - 1.09x slower
size small           33.40 M - 1.14x slower
size large           33.16 M - 1.15x slower
size medium          32.97 M - 1.16x slower
size xlarge          30.64 M - 1.25x slower
count small          18.31 M - 2.09x slower
count medium         18.12 M - 2.11x slower
count xlarge         17.52 M - 2.18x slower
count large          17.50 M - 2.19x slower
peek medium          16.58 M - 2.31x slower
peek small           16.49 M - 2.32x slower
peek xlarge          16.40 M - 2.33x slower
peek large           16.16 M - 2.37x slower
new small             9.01 M - 4.25x slower
new medium            7.54 M - 5.07x slower
new large             6.49 M - 5.89x slower
new xlarge            5.87 M - 6.52x slower
delete small          4.82 M - 7.93x slower
insert small          4.67 M - 8.19x slower
pop small             3.10 M - 12.33x slower
insert medium         2.82 M - 13.58x slower
delete medium         2.81 M - 13.63x slower
pop medium            2.44 M - 15.66x slower
insert large          2.13 M - 17.92x slower
delete large          2.11 M - 18.14x slower
pop large             1.88 M - 20.34x slower
delete xlarge         1.72 M - 22.22x slower
insert xlarge         1.71 M - 22.43x slower
pop xlarge            1.55 M - 24.63x slower
to_list small         1.30 M - 29.45x slower
to_list medium       0.122 M - 313.17x slower
to_list large       0.0104 M - 3677.75x slower
to_list xlarge     0.00080 M - 47966.13x slower
```