acc-0.2.0.2: README.md
# Summary
Data structure intended for accumulating a sequence of elements
for later traversal or folding.
A great basis for implementing many custom monoids,
most notably of the Builder pattern.
It shines with its `Monoid` instance,
which relieves the user from caring about from which side to append.
This is important because,
different data-structures exhibit very different performance depending on that.
Most notably linked list.
`Acc` on the other hand is neutral and performs well in all scenarios.
For such purposes it is common to use `Seq` or `DList`.
The benchmark results below show that `Acc` is a better fit.
# Benchmark results
These benchmarks compare the performance of `Acc` vs. various other structures
as used for aggregation with intent of reduction.
In other words a two-step process of the following structure is measured as a whole:
1. Construct the measured data-structure using a particular method (`cons`, `snoc`, `fromList`)
2. Fold the data-structure into a final result (`sum`, `length`)
Following are the highlights from the benchmark results
grouped by the method of construction of the datastructure.
### Consing 1000 elements
```
acc 12.40 μs
list 18.70 μs
dlist 43.95 μs
sequence 27.54 μs
```
### Snocing 1000 elements
```
acc 17.02 μs
dlist 38.93 μs
sequence 27.15 μs
```
_No list here because it will blow up the memory._
### Construction from a list of 1000 elements
```
acc 13.27 μs
list 12.97 μs
dlist 27.57 μs
sequence 10.70 μs
```
### Appending chunks of 1000 elements 1000 times from left
```
acc 4.256 ms
list 553.7 ms
dlist 315.9 ms
sequence 10.05 ms
```
### Appending chunks of 1000 elements 1000 times from right
```
acc 4.305 ms
list 5.126 s
dlist 360.4 ms
sequence 7.209 ms
```
---
For complete results see [the dump](bench-results).
_Executed on an AWS c6i.2xlarge instance running Ubuntu._
## Conclusions
Given the preconditions of the benchmarks, the following can be concluded:
- Neither list or `DList` are suitable as monoidal structures, due to exponential performance degradation on appends from both sides
- Snocing and even consing `Acc` is better than all alternatives
- `Acc` performs better than `Seq` on both left- and right-appends (2-3x)
- `Seq` gets constructed from list faster than `Acc` (1.5x)