use yufmath::{
Expression, Number, BinaryOperator,
SharedExpression, CowExpression, MemoryManager, MemoryMonitor,
ExpressionBuilder, ExpressionComparator
};
use std::time::Instant;
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== Yufmath 内存管理优化演示 ===\n");
demo_shared_expressions()?;
demo_copy_on_write()?;
demo_memory_manager()?;
demo_expression_builder()?;
demo_performance_comparison()?;
demo_memory_monitoring()?;
Ok(())
}
fn demo_shared_expressions() -> Result<(), Box<dyn std::error::Error>> {
println!("1. 共享表达式演示");
println!("================");
let expr = Expression::Number(Number::integer(42));
let shared1 = SharedExpression::new(expr.clone());
let shared2 = shared1.clone_shared();
println!("创建共享表达式:");
println!(" 表达式内容: {:?}", shared1.as_ref());
println!(" shared1 引用计数: {}", shared1.ref_count());
println!(" shared2 引用计数: {}", shared2.ref_count());
println!(" 是否相等: {}", shared1 == shared2);
println!(" shared1 是否唯一: {}", shared1.is_unique());
drop(shared2);
println!("\n释放 shared2 后:");
println!(" shared1 引用计数: {}", shared1.ref_count());
println!(" shared1 是否唯一: {}", shared1.is_unique());
println!();
Ok(())
}
fn demo_copy_on_write() -> Result<(), Box<dyn std::error::Error>> {
println!("2. 写时复制演示");
println!("==============");
let expr = Expression::Number(Number::integer(42));
let shared = SharedExpression::new(expr);
let mut cow1 = CowExpression::from_shared(shared.clone_shared());
let cow2 = CowExpression::from_shared(shared.clone_shared());
println!("创建写时复制表达式:");
println!(" cow1 引用计数: {}", cow1.ref_count());
println!(" cow2 引用计数: {}", cow2.ref_count());
println!(" cow1 是否已修改: {}", cow1.is_modified());
println!("\n修改 cow1 (触发写时复制):");
let mutable_ref = cow1.as_mut();
*mutable_ref = Expression::Number(Number::integer(43));
println!(" cow1 引用计数: {}", cow1.ref_count());
println!(" cow2 引用计数: {}", cow2.ref_count());
println!(" cow1 是否已修改: {}", cow1.is_modified());
println!(" cow1 内容: {:?}", cow1.as_ref());
println!(" cow2 内容: {:?}", cow2.as_ref());
println!();
Ok(())
}
fn demo_memory_manager() -> Result<(), Box<dyn std::error::Error>> {
println!("3. 内存管理器演示");
println!("================");
let mut manager = MemoryManager::new();
println!("创建多个相同的表达式:");
let expressions = vec![
Expression::Number(Number::integer(42)),
Expression::Number(Number::integer(42)),
Expression::Variable("x".to_string()),
Expression::Variable("x".to_string()),
];
let mut shared_expressions = Vec::new();
for (i, expr) in expressions.into_iter().enumerate() {
let shared = manager.create_shared(expr);
shared_expressions.push(shared);
println!(" 表达式 {}: 引用计数 {}", i + 1, shared_expressions[i].ref_count());
}
let stats = manager.get_stats();
println!("\n内存统计:");
println!(" 活跃表达式: {}", stats.active_expressions);
println!(" 共享表达式: {}", stats.shared_expressions);
println!(" 缓存命中: {}", stats.cache_hits);
println!(" 缓存未命中: {}", stats.cache_misses);
println!(" 估计内存使用: {} 字节", stats.estimated_memory_usage);
println!("\n执行内存清理...");
manager.cleanup();
let stats_after = manager.get_stats();
println!(" 清理后共享表达式: {}", stats_after.shared_expressions);
println!();
Ok(())
}
fn demo_expression_builder() -> Result<(), Box<dyn std::error::Error>> {
println!("4. 表达式构建器演示");
println!("==================");
let mut builder = ExpressionBuilder::new();
println!("创建常用表达式 (应该使用缓存):");
let x1 = builder.variable("x");
let x2 = builder.variable("x");
let one1 = builder.number(Number::integer(1));
let one2 = builder.number(Number::integer(1));
println!(" x1 == x2: {}", x1 == x2);
println!(" one1 == one2: {}", one1 == one2);
println!("\n创建复杂表达式 (自动简化):");
let x = builder.variable("x");
let zero = builder.number(Number::integer(0));
let one = builder.number(Number::integer(1));
let x_plus_zero = builder.add(x.clone_shared(), zero.clone_shared());
println!(" x + 0 = {:?}", x_plus_zero.as_ref());
println!(" 简化结果与 x 相等: {}", x_plus_zero == x);
let x_times_one = builder.multiply(x.clone_shared(), one.clone_shared());
println!(" x * 1 = {:?}", x_times_one.as_ref());
println!(" 简化结果与 x 相等: {}", x_times_one == x);
let x_minus_x = builder.subtract(x.clone_shared(), x.clone_shared());
println!(" x - x = {:?}", x_minus_x.as_ref());
println!(" 简化结果与 0 相等: {}", x_minus_x == zero);
let stats = builder.memory_stats();
println!("\n构建器内存统计:");
println!(" 缓存命中: {}", stats.cache_hits);
println!(" 缓存未命中: {}", stats.cache_misses);
println!();
Ok(())
}
fn demo_performance_comparison() -> Result<(), Box<dyn std::error::Error>> {
println!("5. 性能比较演示");
println!("==============");
const NUM_EXPRESSIONS: usize = 1000;
println!("创建 {} 个普通表达式:", NUM_EXPRESSIONS);
let start = Instant::now();
let mut normal_expressions = Vec::new();
for i in 0..NUM_EXPRESSIONS {
let expr = Expression::BinaryOp {
op: BinaryOperator::Add,
left: Box::new(Expression::Variable("x".to_string())),
right: Box::new(Expression::Number(Number::integer(i as i64))),
};
normal_expressions.push(expr);
}
let normal_duration = start.elapsed();
println!(" 用时: {:?}", normal_duration);
println!("\n创建 {} 个共享表达式:", NUM_EXPRESSIONS);
let start = Instant::now();
let mut manager = MemoryManager::new();
let mut shared_expressions = Vec::new();
for i in 0..NUM_EXPRESSIONS {
let expr = Expression::BinaryOp {
op: BinaryOperator::Add,
left: Box::new(Expression::Variable("x".to_string())),
right: Box::new(Expression::Number(Number::integer(i as i64))),
};
let shared = manager.create_shared(expr);
shared_expressions.push(shared);
}
let shared_duration = start.elapsed();
println!(" 用时: {:?}", shared_duration);
let stats = manager.get_stats();
println!(" 缓存命中: {}", stats.cache_hits);
println!(" 缓存未命中: {}", stats.cache_misses);
println!(" 命中率: {:.2}%",
stats.cache_hits as f64 / (stats.cache_hits + stats.cache_misses) as f64 * 100.0);
println!("\n表达式比较性能测试:");
let mut comparator = ExpressionComparator::new();
let expr1 = Expression::BinaryOp {
op: BinaryOperator::Multiply,
left: Box::new(Expression::Variable("x".to_string())),
right: Box::new(Expression::Number(Number::integer(2))),
};
let expr2 = expr1.clone();
let start = Instant::now();
for _ in 0..1000 {
let _ = expr1 == expr2;
}
let normal_compare_duration = start.elapsed();
let start = Instant::now();
for _ in 0..1000 {
let _ = comparator.fast_eq(&expr1, &expr2);
}
let fast_compare_duration = start.elapsed();
println!(" 普通比较 1000 次: {:?}", normal_compare_duration);
println!(" 优化比较 1000 次: {:?}", fast_compare_duration);
println!(" 性能提升: {:.2}x",
normal_compare_duration.as_nanos() as f64 / fast_compare_duration.as_nanos() as f64);
println!();
Ok(())
}
fn demo_memory_monitoring() -> Result<(), Box<dyn std::error::Error>> {
println!("6. 内存监控演示");
println!("==============");
let mut monitor = MemoryMonitor::new();
monitor.set_interval(std::time::Duration::from_millis(100));
println!("创建大量表达式并监控内存使用:");
for i in 0..500 {
let expr = Expression::BinaryOp {
op: BinaryOperator::Power,
left: Box::new(Expression::Variable(format!("x{}", i % 10))),
right: Box::new(Expression::Number(Number::integer(i as i64))),
};
{
let manager = monitor.manager();
let _shared = manager.create_shared(expr);
}
if i % 100 == 0 {
if let Some(stats) = monitor.check() {
println!(" 第 {} 个表达式 - 内存使用: {} 字节, 共享表达式: {}",
i, stats.estimated_memory_usage, stats.shared_expressions);
}
}
}
let final_stats = monitor.stats();
println!("\n最终内存统计:");
println!(" 活跃表达式: {}", final_stats.active_expressions);
println!(" 共享表达式: {}", final_stats.shared_expressions);
println!(" 总缓存命中: {}", final_stats.cache_hits);
println!(" 总缓存未命中: {}", final_stats.cache_misses);
println!(" 估计内存使用: {} 字节", final_stats.estimated_memory_usage);
println!("\n执行内存清理...");
monitor.cleanup();
let cleaned_stats = monitor.stats();
println!(" 清理后内存使用: {} 字节", cleaned_stats.estimated_memory_usage);
println!(" 清理后共享表达式: {}", cleaned_stats.shared_expressions);
println!();
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_demo_functions() {
assert!(demo_shared_expressions().is_ok());
assert!(demo_copy_on_write().is_ok());
assert!(demo_memory_manager().is_ok());
assert!(demo_expression_builder().is_ok());
assert!(demo_performance_comparison().is_ok());
assert!(demo_memory_monitoring().is_ok());
}
}