5个版本
0.1.4 | 2022年10月25日 |
---|---|
0.1.3 | 2022年7月15日 |
0.1.2 | 2022年6月8日 |
0.1.1 | 2022年6月7日 |
0.1.0 | 2022年6月7日 |
#301 在 压缩
用于 unarc-rs
76KB
1.5K SLoC
salzweg
Salzweg是一个LZW编码器和解码器。它支持LZW的GIF风格、TIFF风格和固定代码风格。
LZW是一种通用的无损数据压缩算法。
该库的目标是内存高效和快速。
- 解码器仅在栈上运行,因此对内存较低的机器友好。
- 编码器则基于堆构建,因为它在压缩过程中创建了一个不断增长的可能的编码词树。
速度
首先,一些公式
- 压缩速度 = 每秒压缩的未压缩字节数。
- 解压速度 = 每秒解压的未压缩字节数。
结果
在AMD Ryzen 7 2700X 八核处理器上使用criterion处理数据时,我观察到以下吞吐量
可变编码器 | 固定12位大小 | |
---|---|---|
压缩图像数据 | 70 MiB/s | 120 MiB/s |
解压图像数据 | 200 MiB/s | 210 MiB/s |
压缩lorem ipsum文本 | 70 MiB/s | 85 MiB/s |
解压lorem ipsum文本 | 200 MiB/s | 220 MiB/s |
这些时间已四舍五入,指示的准确性超过100%。但它们始终比LZW和Weezlcrate的编码速度快,并且始终比Weezlcrate的解码速度快(我没有尝试用LZW解码,因为比较因API设计而困难)。
来源
- 这个链接无疑帮助我彻底理解了LZW: https://www.eecis.udel.edu/~amer/CISC651/lzw.and.gif.explained.html
- 这个Rust示例是实现压缩的好起点,尽管后来完全放弃了这个解决方案。
- Rust中的内存分配树,因为我编码器中使用了类似的东西。
许可证
代码采用MIT许可证。