Rust函数记忆化库memoize-inner的使用,memoize-inner提供高性能缓存与自动结果复用功能

// 示例代码
use memoize_inner::memoize;

#[memoize]
fn fibonacci(n: u64) -> u64 {
    if n < 2 {
        return n;
    }
    fibonacci(n - 1) + fibonacci(n - 2)
}

fn main() {
    // 第一次调用会计算并缓存结果
    println!("fibonacci(10) = {}", fibonacci(10));
    
    // 第二次调用相同参数会直接返回缓存结果
    println!("fibonacci(10) = {}", fibonacci(10));
    
    // 不同参数会重新计算
    println!("fibonacci(15) = {}", fibonacci(15));
}
// 完整示例demo
use memoize_inner::memoize;
use std::time::Instant;
use std::thread::sleep;
use std::time::Duration;

// 使用memoize宏标记需要记忆化的函数
#[memoize]
fn expensive_computation(x: u64) -> u64 {
    // 模拟耗时操作
    sleep(Duration::from_millis(500));
    x * x
}

// 支持多个参数的函数
#[memoize]
fn multi_param_function(a: u64, b: u64) -> u64 {
    sleep(Duration::from_millis(300));
    a + b
}

// 支持自定义键类型的函数(需要实现Hash + Eq + Clone)
#[memoize]
fn string_param_function(s: String) -> usize {
    sleep(Duration::from_millis(200));
    s.len()
}

fn main() {
    println!("演示memoize-inner库的使用:");
    println!("=========================");
    
    // 测试单参数函数
    let start = Instant::now();
    let result1 = expensive_computation(5);
    let duration1 = start.elapsed();
    println!("第一次计算 expensive_computation(5): {} (耗时: {:?})", result1, duration1);
    
    let start = Instant::now();
    let result2 = expensive_computation(5);
    let duration2 = start.elapsed();
    println!("第二次计算 expensive_computation(5): {} (耗时: {:?})", result2, duration2);
    
    // 测试多参数函数
    println!("\n测试多参数函数:");
    let start = Instant::now();
    let result3 = multi_param_function(3, 4);
    let duration3 = start.elapsed();
    println!("multi_param_function(3, 4) = {} (耗时: {:?})", result3, duration3);
    
    let start = Instant::now();
    let result4 = multi_param_function(3, 4);
    let duration4 = start.elapsed();
    println!("再次调用 multi_param_function(3, 4) = {} (耗时: {:?})", result4, duration4);
    
    // 测试字符串参数
    println!("\n测试字符串参数函数:");
    let test_string = String::from("hello");
    let start = Instant::now();
    let len1 = string_param_function(test_string.clone());
    let duration5 = start.elapsed();
    println!("string_param_function(\"hello\") = {} (耗时: {:?})", len1, duration5);
    
    let start = Instant::now();
    let len2 = string_param_function(test_string);
    let duration6 = start.elapsed();
    println!("再次调用 string_param_function(\"hello\") = {} (耗时: {:?})", len2, duration6);
    
    println!("\n注意:缓存结果仅在相同参数时复用,不同参数会重新计算");
    let start = Instant::now();
    let result5 = expensive_computation(10); // 新参数,会重新计算
    let duration7 = start.elapsed();
    println!("expensive_computation(10) = {} (耗时: {:?})", result5, duration7);
}

memoize-inner是一个Rust函数记忆化库,提供高性能缓存与自动结果复用功能。通过使用#[memoize]过程宏,可以轻松地为函数添加记忆化功能,自动缓存函数调用的结果,当使用相同参数再次调用时直接返回缓存值,避免重复计算。

主要特性:

  • 高性能的缓存实现
  • 支持任意数量和类型的参数
  • 线程安全的缓存存储
  • 自动的结果复用机制
  • 简单的使用方式,只需添加一个属性宏

安装方式: 在Cargo.toml中添加依赖:memoize-inner = "0.5.1"

该库特别适用于计算密集型函数或需要频繁调用的昂贵操作,能显著提升程序性能。


1 回复

Rust函数记忆化库memoize-inner使用指南

简介

memoize-inner是一个高性能的Rust函数记忆化库,通过缓存函数调用的结果来实现自动结果复用。该库特别适用于计算密集型函数,能够显著减少重复计算的开销。

主要特性

  • 线程安全的缓存实现
  • 支持自定义缓存策略
  • 零成本抽象设计
  • 简单易用的API

安装方法

在Cargo.toml中添加依赖:

[dependencies]
memoize-inner = "0.1"

基本使用方法

1. 基本记忆化

use memoize_inner::memoize;

#[memoize]
fn fibonacci(n: u64) -> u64 {
    if n <= 1 {
        return n;
    }
    fibonacci(n - 1) + fibonacci(n - 2)
}

fn main() {
    // 第一次计算会被缓存
    println!("{}", fibonacci(10)); // 计算并缓存
    println!("{}", fibonacci(10)); // 直接从缓存读取
}

2. 带参数的函数

use memoize_inner::memoize;

#[memoize]
fn expensive_calculation(x: i32, y: i32) -> i32 {
    println!("执行计算: {} + {}", x, y);
    x + y
}

fn main() {
    println!("{}", expensive_calculation(2, 3)); // 输出"执行计算: 2 + 3"并返回5
    println!("{}", expensive_calculation(2, 3)); // 直接返回5,不输出信息
}

3. 自定义缓存容量

use memoize_inner::memoize;

#[memoize(Capacity = 100)]
fn cached_function(input: String) -> usize {
    input.len()
}

fn main() {
    // 最多缓存100个不同的输入结果
    println!("{}", cached_function("hello".to_string()));
}

高级用法

自定义哈希实现

use memoize_inner::memoize;
use std::hash::{Hash, Hasher};

#[derive(Clone)]
struct CustomType {
    data: String,
}

impl Hash for CustomType {
    fn hash<H: Hasher>(&self, state: &mut H) {
        self.data.hash(state);
    }
}

#[memoize]
fn process_custom_type(ct: CustomType) -> String {
    format!("Processed: {}", ct.data)
}

异步函数记忆化

use memoize_inner::memoize;
use tokio::time::{sleep, Duration};

#[memoize]
async fn async_operation(key: String) -> String {
    sleep(Duration::from_secs(1)).await;
    format!("Result for {}", key)
}

#[tokio::main]
async fn main() {
    let result = async_operation("test".to_string()).await;
    println!("{}", result);
}

性能建议

  1. 对于小规模计算,记忆化可能带来额外开销
  2. 合理设置缓存容量以避免内存溢出
  3. 对于纯函数使用记忆化效果最佳

注意事项

  • 记忆化函数应该是纯函数(相同输入总是产生相同输出)
  • 注意内存使用情况,特别是缓存大量数据时
  • 对于可变引用参数需要特殊处理

这个库通过简单的属性宏实现了强大的记忆化功能,是优化重复计算的理想选择。

完整示例demo

// 完整示例:展示memoize-inner库的各种用法
use memoize_inner::memoize;
use std::hash::{Hash, Hasher};
use tokio::time::{sleep, Duration};

// 基本记忆化示例:斐波那契数列
#[memoize]
fn fibonacci(n: u64) -> u64 {
    if n <= 1 {
        return n;
    }
    fibonacci(n - 1) + fibonacci(n - 2)
}

// 带参数的函数记忆化
#[memoize]
fn expensive_calculation(x: i32, y: i32) -> i32 {
    println!("执行计算: {} + {}", x, y);
    x + y
}

// 自定义缓存容量
#[memoize(Capacity = 100)]
fn cached_function(input: String) -> usize {
    input.len()
}

// 自定义类型支持
#[derive(Clone)]
struct CustomType {
    data: String,
}

impl Hash for CustomType {
    fn hash<H: Hasher>(&self, state: &mut H) {
        self.data.hash(state);
    }
}

#[memoize]
fn process_custom_type(ct: CustomType) -> String {
    format!("Processed: {}", ct.data)
}

// 异步函数记忆化
#[memoize]
async fn async_operation(key: String) -> String {
    sleep(Duration::from_secs(1)).await;
    format!("Result for {}", key)
}

fn main() {
    // 基本记忆化演示
    println!("=== 基本记忆化演示 ===");
    println!("第一次计算fibonacci(10): {}", fibonacci(10));
    println!("第二次计算fibonacci(10): {}", fibonacci(10)); // 从缓存读取
    
    // 带参数的函数演示
    println!("\n=== 带参数的函数演示 ===");
    println!("第一次计算: {}", expensive_calculation(2, 3));
    println!("第二次计算: {}", expensive_calculation(2, 3)); // 从缓存读取
    
    // 自定义缓存容量演示
    println!("\n=== 自定义缓存容量演示 ===");
    println!("字符串长度: {}", cached_function("hello".to_string()));
    
    // 自定义类型演示
    println!("\n=== 自定义类型演示 ===");
    let custom = CustomType { data: "test".to_string() };
    println!("处理结果: {}", process_custom_type(custom.clone()));
    println!("再次处理: {}", process_custom_type(custom)); // 从缓存读取
}

// 异步函数演示需要单独运行
#[tokio::main]
async fn async_main() {
    println!("\n=== 异步函数演示 ===");
    let result = async_operation("test".to_string()).await;
    println!("异步操作结果: {}", result);
    let result2 = async_operation("test".to_string()).await; // 从缓存读取
    println!("再次异步操作: {}", result2);
}

这个完整示例展示了memoize-inner库的所有主要功能,包括基本记忆化、带参数函数、自定义缓存容量、自定义类型支持以及异步函数记忆化。每个功能都有相应的演示代码和注释说明。

回到顶部