packages feed

snappy-hs-0.1.2.0: README.md

# snappy-hs

A pure Haskell implementation of the Snappy compression format.

This library prioritizes portability and simplicity over raw speed. It works reliably across platforms without requiring a C toolchain or dealing with FFI.

## Performance

Measured against the native C library (the `snappy` bindings) on the Google Snappy
test corpus, GHC 9.12 / aarch64, library built with `-O2`:

| dataset (size)        | decompress vs C | compress vs C |
| --------------------- | --------------- | ------------- |
| html (100 KB)         | 1.8x            | 2.3x          |
| alice29.txt (149 KB)  | 1.5x            | 3.1x          |
| geo.protodata (116 KB)| 1.8x            | 2.4x          |
| urls.10K (686 KB)     | 2.1x            | 2.6x          |
| fireworks.jpeg (120 KB, incompressible) | 1.0x | 1.8x |

**Decompression runs at roughly C parity** (~1-2x) and compression is ~2-3x of C.
The gap that remains is GHC's native code generator versus a C compiler, not the
algorithm — the encoder mirrors C Snappy's `CompressFragment` (skip heuristic,
word-at-a-time match extension, input-sized hash table). Output is validated to be
byte-compatible with the C library in both directions.

Reproduce with `cabal bench` (criterion, needs the C `snappy` library installed)
or `cabal run snappy-bench` (pure, no C dependency).

## When to use

* You want **cross-platform Snappy encode/decode** with a **pure Haskell** dependency stack
* You’d rather avoid **C FFI** and the build/packaging complexity that comes with it

## When not to use

* You need **maximum throughput** (use the native library or an FFI-based binding instead).
  You would get a lot of mileage from the library too however.