#string #smaz #string-compression

fast-smaz

纯 Rust SMAZ 压缩实现

1 个不稳定版本

0.1.0 2022年7月3日

#483 in 压缩

MIT 许可证

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-smazfast-smaz 共享相似的代码,该代码是简单的反向代码表查找。

此外,fast-smaz 使用 const 为代码表和反向代码表,这允许编译器进行激进的优化,这降低了缓存未命中和 RAM 访问,因为 const 变量可以在(并且很可能)使用位置内联。

功能

custom-cookbook:仅限开发使用,在正确翻译原始C实现代码簿之前,曾作为测试代码簿使用。它的效率非常低,分布也很差。它使用的是src/hashing.rs算法构建的,我没有花费太多时间来改进它和确保它的正确性,它只是为了生成一个正确且可用的测试代码簿。请勿使用此代码簿。

没有运行时依赖