README.md
# Cbuf
A [circular buffer](https://en.wikipedia.org/wiki/Circular_buffer) with implementations built on `queue`, `map` and `ets`.
[![Build Status](https://travis-ci.org/ckampfe/cbuf.svg?branch=master)](https://travis-ci.org/ckampfe/cbuf)
## Installation
```elixir
def deps do
[
{:cbuf, "~> 0.6"}
]
end
```
See the docs at [https://hexdocs.pm/cbuf](https://hexdocs.pm/cbuf) for usage information.
## Benchmarks
```
$ mix run bench.exs
Compiling 4 files (.ex)
Small N: 50
Medium N: 5000
Small N: 50000
Operating System: macOS"
CPU Information: Intel(R) Core(TM) i7-4578U CPU @ 3.00GHz
Number of Available Cores: 4
Available memory: 16 GB
Elixir 1.7.3
Erlang 21.0.7
Benchmark suite executing with the following configuration:
warmup: 2 s
time: 5 s
memory time: 3 s
parallel: 1
inputs: none specified
Estimated total run time: 15 min
Benchmarking map insert medium...
Benchmarking map size small...
Benchmarking ets insert small...
Benchmarking map insert small...
Benchmarking map size medium...
Benchmarking queue member? medium...
Benchmarking queue count medium...
Benchmarking map to_list small...
Benchmarking queue size large...
Benchmarking queue to_list large...
Benchmarking map member? large...
Benchmarking queue count large...
Benchmarking ets peek small...
Benchmarking map empty? large...
Benchmarking ets count small...
Benchmarking queue new small...
Benchmarking queue empty? medium...
Benchmarking ets insert medium...
Benchmarking map peek small...
Benchmarking ets peek large...
Benchmarking map member? small...
Benchmarking queue insert small...
Benchmarking map pop medium...
Benchmarking map new medium...
Benchmarking ets empty? medium...
Benchmarking ets empty? small...
Benchmarking queue peek small...
Benchmarking map delete medium...
Benchmarking map to_list medium...
Benchmarking queue new medium...
Benchmarking ets pop small...
Benchmarking ets delete large...
Benchmarking ets count large...
Benchmarking map count large...
Benchmarking map peek large...
Benchmarking ets member? large...
Benchmarking map member? medium...
Benchmarking queue delete medium...
Benchmarking ets size small...
Benchmarking ets empty? large...
Benchmarking ets size large...
Benchmarking queue insert large...
Benchmarking map new small...
Benchmarking ets member? medium...
Benchmarking ets new small...
Benchmarking queue count small...
Benchmarking map new large...
Benchmarking map count medium...
Benchmarking queue insert medium...
Benchmarking ets pop large...
Benchmarking queue pop medium...
Benchmarking ets new large...
Benchmarking queue size medium...
Benchmarking queue peek large...
Benchmarking ets delete small...
Benchmarking map delete small...
Benchmarking queue member? small...
Benchmarking map to_list large...
Benchmarking map peek medium...
Benchmarking ets to_list medium...
Benchmarking ets new medium...
Benchmarking map pop large...
Benchmarking map empty? medium...
Benchmarking map insert large...
Benchmarking queue new large...
Benchmarking ets peek medium...
Benchmarking queue delete small...
Benchmarking ets to_list large...
Benchmarking map count small...
Benchmarking queue size small...
Benchmarking map pop small...
Benchmarking queue pop large...
Benchmarking map empty? small...
Benchmarking queue empty? large...
Benchmarking queue member? large...
Benchmarking queue to_list small...
Benchmarking ets pop medium...
Benchmarking ets size medium...
Benchmarking ets to_list small...
Benchmarking ets member? small...
Benchmarking ets delete medium...
Benchmarking queue to_list medium...
Benchmarking map size large...
Benchmarking queue delete large...
Benchmarking map delete large...
Benchmarking ets insert large...
Benchmarking ets count medium...
Benchmarking queue empty? small...
Benchmarking queue peek medium...
Benchmarking queue pop small...
Name ips average deviation median 99th %
queue count large 36.63 M 0.0273 μs ±25.48% 0.0260 μs 0.0505 μs
queue empty? large 36.03 M 0.0278 μs ±105.62% 0.0260 μs 0.0510 μs
queue empty? medium 36.00 M 0.0278 μs ±44.66% 0.0260 μs 0.0530 μs
map empty? small 35.66 M 0.0280 μs ±24.58% 0.0270 μs 0.0530 μs
map empty? large 35.37 M 0.0283 μs ±140.62% 0.0270 μs 0.0570 μs
ets empty? large 34.61 M 0.0289 μs ±29.37% 0.0270 μs 0.0590 μs
map size large 34.46 M 0.0290 μs ±23.70% 0.0280 μs 0.0540 μs
ets size medium 34.23 M 0.0292 μs ±60.39% 0.0280 μs 0.0540 μs
queue size small 34.12 M 0.0293 μs ±46.84% 0.0280 μs 0.0550 μs
map empty? medium 32.82 M 0.0305 μs ±142.15% 0.0270 μs 0.0710 μs
ets size large 32.47 M 0.0308 μs ±33.63% 0.0280 μs 0.0640 μs
queue empty? small 30.72 M 0.0326 μs ±137.15% 0.0270 μs 0.0810 μs
ets empty? medium 30.33 M 0.0330 μs ±164.37% 0.0270 μs 0.101 μs
queue count medium 29.79 M 0.0336 μs ±208.37% 0.0270 μs 0.0930 μs
queue count small 29.46 M 0.0339 μs ±206.73% 0.0260 μs 0.117 μs
queue size large 29.32 M 0.0341 μs ±209.42% 0.0290 μs 0.0770 μs
ets empty? small 27.98 M 0.0357 μs ±275.08% 0.0270 μs 0.124 μs
ets size small 27.90 M 0.0358 μs ±206.62% 0.0290 μs 0.0840 μs
queue delete small 27.87 M 0.0359 μs ±24.88% 0.0340 μs 0.0660 μs
queue delete large 27.75 M 0.0360 μs ±25.91% 0.0340 μs 0.0670 μs
map size medium 26.56 M 0.0377 μs ±213.51% 0.0290 μs 0.126 μs
map size small 23.59 M 0.0424 μs ±293.96% 0.0280 μs 0.182 μs
queue delete medium 22.60 M 0.0442 μs ±229.87% 0.0340 μs 0.139 μs
queue new large 22.05 M 0.0453 μs ±741.77% 0.0400 μs 0.110 μs
queue new small 21.55 M 0.0464 μs ±705.26% 0.0400 μs 0.130 μs
map count small 18.42 M 0.0543 μs ±106.97% 0.0500 μs 0.0990 μs
queue peek medium 17.97 M 0.0556 μs ±181.07% 0.0430 μs 0.21 μs
queue peek large 17.75 M 0.0563 μs ±91.49% 0.0440 μs 0.105 μs
ets count small 17.58 M 0.0569 μs ±20.47% 0.0550 μs 0.100 μs
queue new medium 17.42 M 0.0574 μs ±1020.13% 0.0400 μs 0.170 μs
ets count medium 17.29 M 0.0578 μs ±26.65% 0.0540 μs 0.107 μs
queue peek small 16.93 M 0.0591 μs ±253.04% 0.0440 μs 0.25 μs
map count large 16.28 M 0.0614 μs ±136.05% 0.0500 μs 0.24 μs
queue member? large 16.10 M 0.0621 μs ±62.13% 0.0590 μs 0.118 μs
queue member? small 15.72 M 0.0636 μs ±29.48% 0.0590 μs 0.130 μs
map count medium 15.19 M 0.0658 μs ±222.03% 0.0510 μs 0.27 μs
map peek small 14.69 M 0.0681 μs ±109.37% 0.0600 μs 0.150 μs
ets count large 13.87 M 0.0721 μs ±195.73% 0.0550 μs 0.30 μs
map peek medium 13.42 M 0.0745 μs ±58.42% 0.0680 μs 0.167 μs
queue pop large 13.18 M 0.0758 μs ±402.77% 0.0700 μs 0.150 μs
queue member? medium 12.78 M 0.0783 μs ±205.67% 0.0620 μs 0.29 μs
queue size medium 11.88 M 0.0841 μs ±528.56% 0.0660 μs 0.33 μs
map peek large 11.70 M 0.0854 μs ±204.43% 0.0620 μs 0.37 μs
queue pop small 10.77 M 0.0928 μs ±397.21% 0.0700 μs 0.26 μs
queue insert medium 7.10 M 0.141 μs ±356.41% 0.110 μs 0.55 μs
queue pop medium 5.58 M 0.179 μs ±514.13% 0.150 μs 0.34 μs
map delete small 5.38 M 0.186 μs ±123.45% 0.170 μs 0.43 μs
ets delete medium 4.88 M 0.20 μs ±45.59% 0.190 μs 0.47 μs
queue to_list small 4.77 M 0.21 μs ±1686.38% 0.20 μs 0.40 μs
ets delete small 4.69 M 0.21 μs ±61.64% 0.190 μs 0.50 μs
ets insert large 4.62 M 0.22 μs ±47.82% 0.20 μs 0.46 μs
ets insert medium 4.52 M 0.22 μs ±125.01% 0.20 μs 0.52 μs
map insert small 4.35 M 0.23 μs ±296.94% 0.170 μs 0.68 μs
map insert large 4.11 M 0.24 μs ±40.60% 0.23 μs 0.63 μs
map pop small 4.11 M 0.24 μs ±36.37% 0.23 μs 0.50 μs
ets delete large 4.00 M 0.25 μs ±208.24% 0.190 μs 0.85 μs
map delete large 3.97 M 0.25 μs ±41.12% 0.23 μs 0.64 μs
ets insert small 3.84 M 0.26 μs ±204.22% 0.20 μs 0.89 μs
map insert medium 3.21 M 0.31 μs ±565.96% 0.20 μs 1.10 μs
map pop large 2.93 M 0.34 μs ±1451.56% 0.30 μs 0.80 μs
queue insert small 2.85 M 0.35 μs ±8990.95% 0 μs 1 μs
map pop medium 2.83 M 0.35 μs ±219.67% 0.27 μs 1.20 μs
queue insert large 2.80 M 0.36 μs ±8678.14% 0 μs 1 μs
map delete medium 2.69 M 0.37 μs ±1712.81% 0.20 μs 1.20 μs
ets peek small 1.58 M 0.63 μs ±1379.49% 1 μs 1 μs
ets peek large 1.54 M 0.65 μs ±3721.00% 1 μs 1 μs
ets peek medium 1.50 M 0.67 μs ±1036.64% 1 μs 1 μs
ets pop medium 1.08 M 0.92 μs ±3533.92% 1 μs 2 μs
ets pop small 0.92 M 1.09 μs ±3857.43% 1 μs 2 μs
ets pop large 0.76 M 1.31 μs ±4378.21% 1 μs 3 μs
ets member? small 0.28 M 3.52 μs ±402.66% 3 μs 7 μs
map member? small 0.187 M 5.35 μs ±695.57% 4 μs 16 μs
map to_list small 0.127 M 7.89 μs ±687.96% 6 μs 20 μs
map new small 0.104 M 9.61 μs ±531.81% 7 μs 39 μs
queue to_list medium 0.0461 M 21.67 μs ±202.52% 13 μs 96 μs
ets to_list small 0.0398 M 25.14 μs ±39.17% 24 μs 48 μs
ets new small 0.0240 M 41.63 μs ±179.30% 34 μs 156 μs
queue to_list large 0.00404 M 247.65 μs ±87.71% 108 μs 708 μs
ets member? medium 0.00349 M 286.87 μs ±159.94% 195 μs 2039.06 μs
map member? medium 0.00232 M 431.61 μs ±82.39% 338 μs 2453.11 μs
map to_list medium 0.00111 M 898.77 μs ±71.95% 694 μs 3567.06 μs
map new medium 0.00055 M 1808.78 μs ±45.66% 1600 μs 5512 μs
ets to_list medium 0.00033 M 2996.67 μs ±15.41% 2861 μs 5354.17 μs
ets new medium 0.00029 M 3453.91 μs ±15.59% 3324 μs 5801.12 μs
map member? large 0.00027 M 3716.72 μs ±12.30% 3531 μs 5552.95 μs
ets member? large 0.00016 M 6147.96 μs ±36.04% 5526 μs 13708.14 μs
map to_list large 0.00007 M 13372.52 μs ±18.76% 12578 μs 22136 μs
map new large 0.00004 M 24491.32 μs ±19.78% 23412 μs 40776.10 μs
ets to_list large 0.00003 M 36548.49 μs ±13.48% 35461 μs 59262.10 μs
ets new large 0.00002 M 55398.77 μs ±32.20% 52066 μs 192133 μs
Comparison:
queue count large 36.63 M
queue empty? large 36.03 M - 1.02x slower
queue empty? medium 36.00 M - 1.02x slower
map empty? small 35.66 M - 1.03x slower
map empty? large 35.37 M - 1.04x slower
ets empty? large 34.61 M - 1.06x slower
map size large 34.46 M - 1.06x slower
ets size medium 34.23 M - 1.07x slower
queue size small 34.12 M - 1.07x slower
map empty? medium 32.82 M - 1.12x slower
ets size large 32.47 M - 1.13x slower
queue empty? small 30.72 M - 1.19x slower
ets empty? medium 30.33 M - 1.21x slower
queue count medium 29.79 M - 1.23x slower
queue count small 29.46 M - 1.24x slower
queue size large 29.32 M - 1.25x slower
ets empty? small 27.98 M - 1.31x slower
ets size small 27.90 M - 1.31x slower
queue delete small 27.87 M - 1.31x slower
queue delete large 27.75 M - 1.32x slower
map size medium 26.56 M - 1.38x slower
map size small 23.59 M - 1.55x slower
queue delete medium 22.60 M - 1.62x slower
queue new large 22.05 M - 1.66x slower
queue new small 21.55 M - 1.70x slower
map count small 18.42 M - 1.99x slower
queue peek medium 17.97 M - 2.04x slower
queue peek large 17.75 M - 2.06x slower
ets count small 17.58 M - 2.08x slower
queue new medium 17.42 M - 2.10x slower
ets count medium 17.29 M - 2.12x slower
queue peek small 16.93 M - 2.16x slower
map count large 16.28 M - 2.25x slower
queue member? large 16.10 M - 2.28x slower
queue member? small 15.72 M - 2.33x slower
map count medium 15.19 M - 2.41x slower
map peek small 14.69 M - 2.49x slower
ets count large 13.87 M - 2.64x slower
map peek medium 13.42 M - 2.73x slower
queue pop large 13.18 M - 2.78x slower
queue member? medium 12.78 M - 2.87x slower
queue size medium 11.88 M - 3.08x slower
map peek large 11.70 M - 3.13x slower
queue pop small 10.77 M - 3.40x slower
queue insert medium 7.10 M - 5.16x slower
queue pop medium 5.58 M - 6.57x slower
map delete small 5.38 M - 6.81x slower
ets delete medium 4.88 M - 7.51x slower
queue to_list small 4.77 M - 7.68x slower
ets delete small 4.69 M - 7.82x slower
ets insert large 4.62 M - 7.94x slower
ets insert medium 4.52 M - 8.10x slower
map insert small 4.35 M - 8.43x slower
map insert large 4.11 M - 8.91x slower
map pop small 4.11 M - 8.92x slower
ets delete large 4.00 M - 9.16x slower
map delete large 3.97 M - 9.24x slower
ets insert small 3.84 M - 9.54x slower
map insert medium 3.21 M - 11.42x slower
map pop large 2.93 M - 12.49x slower
queue insert small 2.85 M - 12.85x slower
map pop medium 2.83 M - 12.92x slower
queue insert large 2.80 M - 13.09x slower
map delete medium 2.69 M - 13.64x slower
ets peek small 1.58 M - 23.23x slower
ets peek large 1.54 M - 23.75x slower
ets peek medium 1.50 M - 24.41x slower
ets pop medium 1.08 M - 33.83x slower
ets pop small 0.92 M - 39.99x slower
ets pop large 0.76 M - 48.11x slower
ets member? small 0.28 M - 128.91x slower
map member? small 0.187 M - 195.92x slower
map to_list small 0.127 M - 289.21x slower
map new small 0.104 M - 352.05x slower
queue to_list medium 0.0461 M - 794.03x slower
ets to_list small 0.0398 M - 921.15x slower
ets new small 0.0240 M - 1525.20x slower
queue to_list large 0.00404 M - 9072.67x slower
ets member? medium 0.00349 M - 10509.47x slower
map member? medium 0.00232 M - 15811.88x slower
map to_list medium 0.00111 M - 32926.41x slower
map new medium 0.00055 M - 66264.49x slower
ets to_list medium 0.00033 M - 109782.81x slower
ets new medium 0.00029 M - 126533.86x slower
map member? large 0.00027 M - 136162.14x slower
ets member? large 0.00016 M - 225230.34x slower
map to_list large 0.00007 M - 489902.18x slower
map new large 0.00004 M - 897239.20x slower
ets to_list large 0.00003 M - 1338953.51x slower
ets new large 0.00002 M - 2029533.33x slower
Memory usage statistics:
Name Memory usage
queue count large 144 B
queue empty? large 144 B - 1.00x memory usage
queue empty? medium 144 B - 1.00x memory usage
map empty? small 1672 B - 11.61x memory usage
map empty? large 1475592 B - 10247.17x memory usage
ets empty? large 176 B - 1.22x memory usage
map size large 1475592 B - 10247.17x memory usage
ets size medium 176 B - 1.22x memory usage
queue size small 144 B - 1.00x memory usage
map empty? medium 149688 B - 1039.50x memory usage
ets size large 176 B - 1.22x memory usage
queue empty? small 144 B - 1.00x memory usage
ets empty? medium 176 B - 1.22x memory usage
queue count medium 144 B - 1.00x memory usage
queue count small 144 B - 1.00x memory usage
queue size large 144 B - 1.00x memory usage
ets empty? small 176 B - 1.22x memory usage
ets size small 176 B - 1.22x memory usage
queue delete small 144 B - 1.00x memory usage
queue delete large 144 B - 1.00x memory usage
map size medium 149688 B - 1039.50x memory usage
map size small 1672 B - 11.61x memory usage
queue delete medium 144 B - 1.00x memory usage
queue new large 136 B - 0.94x memory usage
queue new small 136 B - 0.94x memory usage
map count small 1672 B - 11.61x memory usage
queue peek medium 144 B - 1.00x memory usage
queue peek large 144 B - 1.00x memory usage
ets count small 176 B - 1.22x memory usage
queue new medium 136 B - 0.94x memory usage
ets count medium 176 B - 1.22x memory usage
queue peek small 144 B - 1.00x memory usage
map count large 1475592 B - 10247.17x memory usage
queue member? large 144 B - 1.00x memory usage
queue member? small 144 B - 1.00x memory usage
map count medium 149688 B - 1039.50x memory usage
map peek small 1672 B - 11.61x memory usage
ets count large 176 B - 1.22x memory usage
map peek medium 149688 B - 1039.50x memory usage
queue pop large 168 B - 1.17x memory usage
queue member? medium 144 B - 1.00x memory usage
queue size medium 144 B - 1.00x memory usage
map peek large 1475592 B - 10247.17x memory usage
queue pop small 168 B - 1.17x memory usage
queue insert medium 248 B - 1.72x memory usage
queue pop medium 168 B - 1.17x memory usage
map delete small 1944 B - 13.50x memory usage
ets delete medium 272 B - 1.89x memory usage
queue to_list small 1776 B - 12.33x memory usage
ets delete small 272 B - 1.89x memory usage
ets insert large 272 B - 1.89x memory usage
ets insert medium 272 B - 1.89x memory usage
map insert small 1944 B - 13.50x memory usage
map insert large 1476168 B - 10251.17x memory usage
map pop small 1968 B - 13.67x memory usage
ets delete large 272 B - 1.89x memory usage
map delete large 1476168 B - 10251.17x memory usage
ets insert small 272 B - 1.89x memory usage
map insert medium 150192 B - 1043.00x memory usage
map pop large 1476192 B - 10251.33x memory usage
queue insert small 248 B - 1.72x memory usage
map pop medium 150216 B - 1043.17x memory usage
queue insert large 248 B - 1.72x memory usage
map delete medium 150192 B - 1043.00x memory usage
ets peek small 256 B - 1.78x memory usage
ets peek large 232 B - 1.61x memory usage
ets peek medium 256 B - 1.78x memory usage
ets pop medium 352 B - 2.44x memory usage
ets pop small 352 B - 2.44x memory usage
ets pop large 352 B - 2.44x memory usage
ets member? small 240 B - 1.67x memory usage
map member? small 4528 B - 31.44x memory usage
map to_list small 6872 B - 47.72x memory usage
map new small 12904 B - 89.61x memory usage
queue to_list medium 87568 B - 608.11x memory usage
ets to_list small 7520 B - 52.22x memory usage
ets new small 1528 B - 10.61x memory usage
queue to_list large 972192 B - 6751.33x memory usage
ets member? medium 488 B - 3.39x memory usage
map member? medium 270544 B - 1878.78x memory usage
map to_list medium 634776 B - 4408.17x memory usage
map new medium 1832320 B - 12724.44x memory usage
ets to_list medium 723960 B - 5027.50x memory usage
ets new medium 120328 B - 835.61x memory usage
map member? large 2676448 B - 18586.44x memory usage
ets member? large 2952 B - 20.50x memory usage
map to_list large 6002784 B - 41686.00x memory usage
map new large 23990664 B - 166601.83x memory usage
ets to_list large 7342208 B - 50987.56x memory usage
ets new large 1200328 B - 8335.61x memory usage
**All measurements for memory usage were the same**
```