A newtype over Bool with a better Vector instance: 8x less memory, up to 1000x faster.
The vector
package represents unboxed arrays of Bool
spending 1 byte (8 bits) per boolean.
This library provides a newtype wrapper Bit and a custom instance
of unboxed Vector, which packs bits densely,
achieving 8x less memory footprint.
The performance stays mostly the same;
the most significant degradation happens for random writes
(up to 10% slower).
On the other hand, for certain bulk bit operations
Vector Bit is up to 1000x faster than Vector Bool.
Data.Bit is faster, but writes and flips are thread-unsafe.
This is because naive updates are not atomic:
read the whole word from memory,
then modify a bit, then write the whole word back.
Data.Bit.ThreadSafe is slower (up to 20%),
but writes and flips are thread-safe.
bv and
bv-little
do not offer mutable vectors.
array
is memory-efficient for Bool, but lacks
a handy Vector interface and is not thread-safe.