Salzweg is a LZW encoder and decoder. It supports the GIF flavored, TIFF flavored and fixed code flavors of LZW.
LZW is a universal lossless data compression algorithm.
The aim of this library is to be memory efficient, and fast.
- The decoder lives only on the stack, and will be friendly with machines with low memory.
- The encoder builds on the heap though, as it creates a growing tree of possible encoded words as the compression progresses.
First, a few formulas
- Compressing speed = uncompressed bytes/seconds to compress.
- Decompressing speed = uncompressed bytes/seconds to decompress.
Using criterion on a AMD Ryzen 7 2700X Eight-Core Processor 3.70 GHz CPU
, I observed the following throughput when processing data:
Variable encoder | Fix 12 bit size | |
---|---|---|
Compressing image data | 70 MiB/s | 120 MiB/s |
Decompressing image data | 200 MiB/s | 210 MiB/s |
Compressing lorem ipsum text | 70 MiB/s | 85 MiB/s |
Decompressing lorem ipsum text | 200 MiB/s | 220 MiB/s |
These timings are rounded, indicative more than 100% accurate. But they are consistently faster than the LZW and Weezl crate for encoding, and consistently faster than the Weezl crate for decoding (I did not try to decode with LZW, as the comparison is difficult due to API design).
- This link definitly helped me understand LZW through and through: https://www.eecis.udel.edu/~amer/CISC651/lzw.and.gif.explained.html
- This rust example was a good starting point for implementing the compression, though this solution was totally abandonned later on.
- Arena-Allocated Trees in Rust as I used something like that in the encoder.
Code is licensed under MIT.