use aether::engine::{EnginePool, GlobalEngine, ScopedEngine};
use std::time::Instant;
fn main() {
println!("=== Aether Engine Modes Demo ===\n");
demo_global_engine();
demo_engine_pool();
demo_scoped_engine();
performance_comparison();
}
fn demo_global_engine() {
println!("📌 1. GlobalEngine (全局单例模式)");
println!(" 适用场景:单线程、高频调用\n");
let result = GlobalEngine::eval_isolated("Set X 10\n(X + 20)").unwrap();
println!(" 执行结果: {}", result);
let result = GlobalEngine::eval_isolated("X");
assert!(result.is_err());
println!(" ✅ 环境隔离:上次的变量 X 已清空");
GlobalEngine::eval("Set Y 100").unwrap();
let result = GlobalEngine::eval("(Y + 1)").unwrap();
println!(" 非隔离模式:Y = {}", result);
GlobalEngine::clear_env();
println!(" ✅ 环境已清空\n");
}
fn demo_engine_pool() {
println!("📌 2. EnginePool (引擎池模式)");
println!(" 适用场景:单线程内需要多个引擎实例\n");
let mut pool = EnginePool::new(4);
println!(" 引擎池大小: {}", pool.capacity());
println!(" 当前可用引擎: {}", pool.available());
{
let mut engine = pool.acquire();
let result = engine.eval("Set X 10\n(X * 2)").unwrap();
println!(" 单次执行: {}", result);
}
println!(" ✅ 引擎已自动归还,当前可用: {}", pool.available());
println!("\n 执行 10 次计算...");
for i in 0..10 {
let mut engine = pool.acquire();
let code = format!("Set X {}\n(X * 2)", i);
let result = engine.eval(&code).unwrap();
if i < 3 {
println!(" 迭代 {} 结果: {}", i, result);
}
}
println!(" ✅ 多次执行完成,引擎复用减少创建开销\n");
}
fn demo_scoped_engine() {
println!("📌 3. ScopedEngine (闭包模式)");
println!(" 适用场景:临时执行、完全隔离\n");
let result = ScopedEngine::eval("Set X 10\n(X + 20)").unwrap();
println!(" 基本执行: {}", result);
let result = ScopedEngine::with(|engine| {
engine.eval("Set X 10")?;
engine.eval("Set Y 20")?;
engine.eval("(X + Y)")
})
.unwrap();
println!(" 闭包风格: {}", result);
let (x, y) = ScopedEngine::with(|engine| {
engine.eval("Set X 100")?;
engine.eval("Set Y 200")?;
let x = engine.eval("X")?;
let y = engine.eval("Y")?;
Ok((x, y))
})
.unwrap();
println!(" 自定义返回: X={}, Y={}", x, y);
let result = ScopedEngine::eval("X");
assert!(result.is_err());
println!(" ✅ 完全隔离:每次都是新引擎\n");
}
fn performance_comparison() {
println!("📌 4. 性能对比");
println!(" 测试代码:重复执行相同脚本 1000 次\n");
let code = "Set X 10\nSet Y 20\n(X + Y)";
let iterations = 1000;
let start = Instant::now();
for _ in 0..iterations {
GlobalEngine::eval_isolated(code).unwrap();
}
let global_time = start.elapsed();
println!(" GlobalEngine: {:?}", global_time);
let mut pool = EnginePool::new(4);
let start = Instant::now();
for _ in 0..iterations {
let mut engine = pool.acquire();
engine.eval(code).unwrap();
}
let pool_time = start.elapsed();
println!(" EnginePool: {:?}", pool_time);
let start = Instant::now();
for _ in 0..iterations {
ScopedEngine::eval(code).unwrap();
}
let scoped_time = start.elapsed();
println!(" ScopedEngine: {:?}", scoped_time);
println!("\n 性能排名:");
println!(" 1️⃣ GlobalEngine (最快,AST缓存效果最好)");
println!(" 2️⃣ EnginePool (略慢,但避免频繁创建)");
println!(" 3️⃣ ScopedEngine (最慢,每次创建新引擎)");
if let Some(stats) = GlobalEngine::cache_stats() {
println!("\n GlobalEngine AST 缓存统计:");
println!(" - 命中次数: {}", stats.hits);
println!(" - 未命中次数: {}", stats.misses);
println!(
" - 命中率: {:.2}%",
stats.hits as f64 / (stats.hits + stats.misses) as f64 * 100.0
);
if stats.hits > 0 {
println!(" ✨ AST缓存显著提升性能!");
}
}
println!("\n=== Demo 完成 ===");
}