#gif #codec #lzw #encoder #decoder #tiff

salzweg

A LZW encoder and decoder, fast and memory efficient

5 releases

0.1.4 Oct 25, 2022
0.1.3 Jul 15, 2022
0.1.2 Jun 8, 2022
0.1.1 Jun 7, 2022
0.1.0 Jun 7, 2022

#301 in Compression


Used in unarc-rs

MIT license

76KB
1.5K SLoC

Docs Crates.io Crates.io

salzweg

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.

Speed

First, a few formulas

  • Compressing speed = uncompressed bytes/seconds to compress.
  • Decompressing speed = uncompressed bytes/seconds to decompress.

Results

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).

Sources

License

Code is licensed under MIT.

No runtime deps