Bindings to Google's Snappy: A fast compression library.
Snappy is a fast (de)compression library. It is written in C++, but a basic set of C bindings is also provided. Although the C bindings only support the "raw" Snappy format, this package provides support for the Snappy "frame" format on top of the raw C API, enabling extremely fast (de)compression of lazy (streamed) data.
snappy-c
Haskell bindings to the C API of Snappy: A fast compression library.
Usage
[!IMPORTANT] To use this package, you must have the Snappy library installed and visible to
cabal
.
If your build fails with a message like:
Error: cabal-3.10.1.0: Missing dependency on a foreign library:
* Missing (or bad) C library: snappy
You need to explicitly configure the include and library paths via cabal. One way to do so is to add something like this to your cabal.project
configuration:
package snappy-c
extra-include-dirs:
/path/to/snappy/include
extra-lib-dirs:
/path/to/snappy/lib
In my case, on a mac using homebrew, the following suffices:
package snappy-c
extra-lib-dirs:
/opt/homebrew/lib
extra-include-dirs:
/opt/homebrew/include
We wouldn't need to do this if the Snappy library supported pkg-config configuration, but as of writing they do not.
Installing Snappy
The Snappy library is available most package managers.
Homebrew
brew install snappy
APT
apt-get install libsnappy-dev
Performance
snappy-c stays true to the speedy spirit of Snappy compression.
The package includes a benchmark suite that compares the compression, decompression, and roundtrip performance of this package against
- a pre-existing (unmaintained) Snappy implementation, and
- the zlib package's zlib and gzip compression format implementations.
Run the benchmarks with:
cabal run bench-snappy-c -- --time-limit 5 -o bench.html
[!IMPORTANT] To build the benchmarks, you will need to set
extra-include-dirs
andextra-lib-dirs
for thesnappy
package as you did forsnappy-c
(see Usage).
Here's a screenshot from the generated bench.html file:
snappy-cli
performance
See snappy-cli/README.md for a demonstration of the performance of this library in a CLI tool.