1 个不稳定版本
0.1.0 | 2022年7月3日 |
---|
#483 in 压缩
44KB
523 行
fast-smaz
smaz 算法的纯 Rust 实现,非常接近原始的 antirez/smaz C 实现,有一些不同。
示例
use fast_smaz::Smaz;
fn main() {
let my_message = "Hello world!";
let compressed = my_message.smaz_compress();
let decompressed = compressed.smaz_decompress().unwrap();
assert_eq!(my_message.as_bytes(), decompressed);
}
灵感来源
此实现受到原始 antirez/smaz 和 Ruby 实现 peterc/rsmaz 的启发。
比较
fast-smaz 与 antirez/smaz
此实现与原始的 SMAZ ANSI C 实现非常相似,它使用完全相同的哈希表和哈希算法。
我没有测量性能比较,但 ANSI C 实现可以做很多假设,这些假设与 ANSI C 规范和实现的正确性有关,而此 Rust 实现有一些额外的检查以确保代码的安全性,这可能会影响性能,但应该不会产生太大影响。
fast-smaz 与 silentsokolov/rust-smaz
silentsokolov/rust-smaz 使用 lazy_static!
并在第一次执行时创建代码表哈希表,而不是提供预生成的哈希表。
这导致了较慢的编码过程(在我的电脑上的基准测试显示编码速度慢73%),不仅因为 lazy_static!
初始化的开销,而且还因为初始化检查的原子操作和哈希分布本身的开销。
我选择保留 antirez 的原始桶大小和分布,因为它看起来分布良好,性能结果也表明它确实具有非常好的性能。
请注意,将 lazy_static!
更改为 OnceLock
并没有帮助,因为它们非常相似。
性能提升仅适用于编码过程,解码过程具有相似的性能,因为 silentsokolov/rust-smaz 和 fast-smaz 共享相似的代码,该代码是简单的反向代码表查找。
此外,fast-smaz 使用 const
为代码表和反向代码表,这允许编译器进行激进的优化,这降低了缓存未命中和 RAM 访问,因为 const
变量可以在(并且很可能)使用位置内联。
功能
custom-cookbook
:仅限开发使用,在正确翻译原始C实现代码簿之前,曾作为测试代码簿使用。它的效率非常低,分布也很差。它使用的是src/hashing.rs
算法构建的,我没有花费太多时间来改进它和确保它的正确性,它只是为了生成一个正确且可用的测试代码簿。请勿使用此代码簿。