6 个版本

0.2.0 2024 年 7 月 14 日
0.1.4 2023 年 11 月 28 日

内存管理 中排名第 107

Download history 97/week @ 2024-07-08 32/week @ 2024-07-15 12/week @ 2024-07-22

每月下载量 141

MIT 许可证

49KB
459

Hash Cons 库

crates.io docs.rs

Hash Cons 库 (hash_cons) 是一个 Rust 库,它实现了高效的 hash consing 技术,使其成为多线程和单线程 Rust 应用程序的一个稳健选择。该库的核心是设计用于关注类型安全、效率和零成本抽象。

Hash Cons

Hash consing 是一种用于优化内存使用和提高数据密集型应用程序性能的高级技术。它涉及共享不可变数据结构,通过确保相同的数据只存储一次来减少冗余内存分配。这种方法特别适用于重复数据结构(如树或图)普遍存在的场景。通过采用 hash consing,该库保证了高效的内存管理和快速的数据访问,从而显著提高了应用程序的性能。这种技术不仅对于实现最优内存效率至关重要,而且对于确保应用程序的可扩展性和速度也起着至关重要的作用。

效率和 Rust 风格

该库设计成内置于 Rust 中,确保高效的内存管理和最佳性能。它利用 Rust 独特的拥有权和借用规则来管理不可变数据结构。关键特性是其可调的内存管理:当程序中不再引用某个值时,由于默认启用了 auto_cleanup 功能,库会自动清理并高效地管理内存,防止内存泄漏并优化资源使用。这使得它成为处理重复数据结构的应用程序的一个优秀工具,确保内存效率。

特性

  • auto_cleanup:默认启用,此功能允许库通过删除未使用的条目来自动清理和管理内存,从而实现高效的内存管理。
  • 单线程:默认情况下禁用,启用此功能将库切换到单线程实现,适用于不需要线程安全的环境。用户可能会在多线程环境中注意到一些性能问题。

用法

要将 hash_cons 集成到您的项目中,请在您的 Cargo.toml 中将其添加为依赖项。

[dependencies]
hash_cons = "0.2.0"  # Replace with the actual version

默认情况下,库在具有自动清理功能的多线程环境中运行。要支持单线程,请启用 single-threaded 功能。

# Default multi-threaded with auto_cleanup enabled
hash_cons = "0.2.0"

# For single-threaded environments with auto_cleanup enabled
hash_cons = { version = "0.2.0", features = ["single-threaded"] }

# For multi-threaded environments with auto_cleanup disabled
hash_cons = { version = "0.2.0", default-features = false }

# For single-threaded environments with auto_cleanup disabled
hash_cons = { version = "0.2.0", default-features = false, features = ["single-threaded"] }

示例

多线程用法(默认)

[dependencies]
hash_cons = "0.2.0" # Replace with the actual version
use hash_cons::{HcTable, Hc};
use std::thread;

#[derive(Hash, PartialEq, Eq)]
enum BoolExpr {
    Const(bool),
    And(Hc<BoolExpr>, Hc<BoolExpr>),
    Or(Hc<BoolExpr>, Hc<BoolExpr>),
    Not(Hc<BoolExpr>),
}

fn main() {
    let table: HcTable<BoolExpr> = HcTable::new();
    let thread_handle_hc_false = thread::spawn(move || {
        table.hashcons(BoolExpr::Const(false))
    });
    let hc_false: Hc<BoolExpr> = thread_handle_hc_false.join().unwrap(); // Safe for concurrent use across threads
}

单线程用法

[dependencies]
hash_cons = { version = "0.2.0", features = ["single-threaded"] }
use hash_cons::{HcTable, Hc};

#[derive(Hash, PartialEq, Eq)]
enum BoolExpr {
    Const(bool),
    And(Hc<BoolExpr>, Hc<BoolExpr>),
    Or(Hc<BoolExpr>, Hc<BoolExpr>),
    Not(Hc<BoolExpr>),
}

fn main() {
    let table: HcTable<BoolExpr> = HcTable::new();
    let const_true = BoolExpr::Const(true);
    let hc_true: Hc<BoolExpr> = table.hashcons(const_true);
    drop(hc_true);// hc_true is automatically removed from the table when dropped from the memory
}

多线程环境禁用自动清理(默认)

[dependencies]
hash_cons = { version = "0.2.0", default-features = false }
use hash_cons::{HcTable, Hc};
use std::thread;

#[derive(Hash, PartialEq, Eq)]
enum BoolExpr {
    Const(bool),
    And(Hc<BoolExpr>, Hc<BoolExpr>),
    Or(Hc<BoolExpr>, Hc<BoolExpr>),
    Not(Hc<BoolExpr>),
}

fn main() {
    let table: HcTable<BoolExpr> = HcTable::new();
    let table_clone = table.clone();
    let thread_handle_hc_true = thread::spawn(move || {
         table_clone.hashcons(BoolExpr::Const(true))
    });
    let hc_true: Hc<BoolExpr> = thread_handle_hc_true.join().unwrap(); // Safe for concurrent use across threads
    assert_eq!(table.len(), 1);
    drop(hc_true);
    table.cleanup(); //hc_true is removed from the table after it has been dropped and `cleanup()` is called on the table.
    assert_eq!(table.len(), 0);
}

单线程环境禁用自动清理

[dependencies]
hash_cons = { version = "0.2.0", default-features = false, features = ["single-threaded"] }
use hash_cons::{HcTable, Hc};

#[derive(Hash, PartialEq, Eq)]
enum BoolExpr {
    Const(bool),
    And(Hc<BoolExpr>, Hc<BoolExpr>),
    Or(Hc<BoolExpr>, Hc<BoolExpr>),
    Not(Hc<BoolExpr>),
}

fn main() {
    let table: HcTable<BoolExpr> = HcTable::new();
    let const_true = BoolExpr::Const(true);
    let hc_true: Hc<BoolExpr> = table.hashcons(const_true);
    drop(hc_true);
    assert_eq!(table.len(), 1);
    table.cleanup();//hc_true is removed from the table after it has been dropped and `cleanup()` is called on the table.
    assert_eq!(table.len(), 0);
}

贡献

欢迎贡献和建议,以使 hash_cons 更好。如果您有想法或改进建议,请随时提交拉取请求或在此 存储库 中打开一个问题。

许可

根据 MIT 许可证授权。有关更多详细信息,请参阅 LICENSE 文件。

无运行时依赖