Skip to content
This repository was archived by the owner on Aug 18, 2025. It is now read-only.

Commit 59b6477

Browse files
committed
feat(优化): 添加记忆化缓存和尾递归优化功能
- 在虚拟机和解释器中添加记忆化缓存功能,提高重复计算的性能 - 实现尾递归优化,减少尾递归调用的开销 - 新增相关命令行参数,用于控制优化功能的启用和统计报告 - 在执行结果中添加优化统计信息的输出
1 parent 3a7a1ee commit 59b6477

File tree

1 file changed

+76
-23
lines changed

1 file changed

+76
-23
lines changed

src/main.rs

Lines changed: 76 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,7 @@ fn execute_bytecode_file(file_path: &str, vm_debug: bool, vm_tip: bool) -> Resul
354354
main_function: "main".to_string(),
355355
global_constants: bytecode_file.global_constants.into_iter().map(|v| v.into()).collect(),
356356
classes: HashMap::new(),
357+
interfaces: HashMap::new(),
357358
imported_libraries: HashMap::new(), // 暂时为空,后续可以重新加载库
358359
function_indices,
359360
};
@@ -429,6 +430,11 @@ fn main() {
429430
println!(" --cn-vm-tip 显示VM执行提示信息");
430431
println!(" --cn-vm-build 编译为字节码文件(.comcn)并打包库依赖");
431432
println!("");
433+
println!("📊 优化统计选项:");
434+
println!(" --cn-memo-stats 显示记忆化缓存统计(默认隐藏)");
435+
println!(" --cn-tail-stats 显示尾递归优化报告(默认隐藏)");
436+
println!(" --cn-no-memo 临时禁用记忆化缓存优化");
437+
println!("");
432438
println!("示例:");
433439
println!(" {} hello.cn", args[0]);
434440
println!(" {} hello.cn --cn-time", args[0]);
@@ -444,20 +450,61 @@ fn main() {
444450

445451
let file_path = &args[1];
446452

453+
// 解析所有命令行参数(在检查文件类型之前)
454+
let debug_parser = args.iter().any(|arg| arg == "--cn-parser");
455+
let debug_lexer = args.iter().any(|arg| arg == "--cn-lexer");
456+
let debug_mode = args.iter().any(|arg| arg == "--cn-debug");
457+
let show_return = args.iter().any(|arg| arg == "--cn-return");
458+
let query_jit = args.iter().any(|arg| arg == "--cn-query-jit");
459+
let jit_debug = args.iter().any(|arg| arg == "--cn-jit-debug");
460+
let jit_stats = args.iter().any(|arg| arg == "--cn-jit-stats");
461+
let show_time = args.iter().any(|arg| arg == "--cn-time");
462+
let show_rwlock = args.iter().any(|arg| arg == "--cn-rwlock");
463+
let show_memory_stats = args.iter().any(|arg| arg == "--cn-memory-stats");
464+
let memory_debug = args.iter().any(|arg| arg == "--cn-memory-debug");
465+
let show_loop_stats = args.iter().any(|arg| arg == "--cn-loop-stats");
466+
let loop_debug = args.iter().any(|arg| arg == "--cn-loop-debug");
467+
let auto_namespace = args.iter().any(|arg| arg == "--cn-auto-ns");
468+
let check_timeout = args.iter().any(|arg| arg == "--cn-check-timeout");
469+
let use_vm = args.iter().any(|arg| arg == "--cn-vm");
470+
let vm_debug = args.iter().any(|arg| arg == "--cn-vm-debug");
471+
let vm_tip = args.iter().any(|arg| arg == "--cn-vm-tip");
472+
let vm_build = args.iter().any(|arg| arg == "--cn-vm-build");
473+
474+
// 新增:统计报告和记忆化控制选项
475+
let show_memo_stats = args.iter().any(|arg| arg == "--cn-memo-stats");
476+
let show_tail_stats = args.iter().any(|arg| arg == "--cn-tail-stats");
477+
let disable_memo = args.iter().any(|arg| arg == "--cn-no-memo");
478+
479+
// 🚀 初始化记忆化缓存(最大缓存1000个函数调用结果)
480+
interpreter::init_memoization_cache(1000);
481+
482+
// 🚀 初始化记忆化函数集合
483+
interpreter::init_memoized_functions();
484+
485+
// 如果指定了禁用记忆化参数,则禁用记忆化缓存
486+
if disable_memo {
487+
interpreter::disable_memoization();
488+
}
489+
490+
// 🚀 初始化尾递归优化器
491+
interpreter::init_tail_recursion_optimizer();
492+
447493
// 检查是否是.comcn文件(字节码文件)
448494
let is_bytecode_file = file_path.ends_with(".comcn");
449495

450496
if is_bytecode_file {
451497
// 直接执行字节码文件
452-
let show_return = args.iter().any(|arg| arg == "--cn-return");
453-
let show_time = args.iter().any(|arg| arg == "--cn-time");
454-
let vm_debug = args.iter().any(|arg| arg == "--cn-vm-debug");
455-
let vm_tip = args.iter().any(|arg| arg == "--cn-vm-tip");
456498

457499
if vm_tip {
458500
println!("🚀 检测到字节码文件,使用VM模式执行...");
459501
}
460502

503+
// 如果指定了禁用记忆化参数,则禁用记忆化缓存
504+
if disable_memo {
505+
interpreter::disable_memoization();
506+
}
507+
461508
let start_time = if show_time {
462509
Some(std::time::Instant::now())
463510
} else {
@@ -473,6 +520,18 @@ fn main() {
473520
if show_return {
474521
println!("程序执行结果: {:?}", result);
475522
}
523+
524+
// 🚀 显示记忆化缓存统计信息(仅在指定参数时显示)
525+
if show_memo_stats {
526+
if let Some(memo_stats) = interpreter::get_memo_stats() {
527+
memo_stats.print();
528+
}
529+
}
530+
531+
// 🚀 显示尾递归优化报告(仅在指定参数时显示)
532+
if show_tail_stats {
533+
interpreter::print_tail_recursion_report();
534+
}
476535
},
477536
Err(err) => {
478537
eprintln!("字节码执行错误: {}", err);
@@ -482,25 +541,7 @@ fn main() {
482541
return;
483542
}
484543

485-
let debug_parser = args.iter().any(|arg| arg == "--cn-parser");
486-
let debug_lexer = args.iter().any(|arg| arg == "--cn-lexer");
487-
let debug_mode = args.iter().any(|arg| arg == "--cn-debug");
488-
let show_return = args.iter().any(|arg| arg == "--cn-return");
489-
let query_jit = args.iter().any(|arg| arg == "--cn-query-jit");
490-
let jit_debug = args.iter().any(|arg| arg == "--cn-jit-debug");
491-
let jit_stats = args.iter().any(|arg| arg == "--cn-jit-stats");
492-
let show_time = args.iter().any(|arg| arg == "--cn-time");
493-
let show_rwlock = args.iter().any(|arg| arg == "--cn-rwlock");
494-
let show_memory_stats = args.iter().any(|arg| arg == "--cn-memory-stats");
495-
let memory_debug = args.iter().any(|arg| arg == "--cn-memory-debug");
496-
let show_loop_stats = args.iter().any(|arg| arg == "--cn-loop-stats");
497-
let loop_debug = args.iter().any(|arg| arg == "--cn-loop-debug");
498-
let auto_namespace = args.iter().any(|arg| arg == "--cn-auto-ns");
499-
let check_timeout = args.iter().any(|arg| arg == "--cn-check-timeout");
500-
let use_vm = args.iter().any(|arg| arg == "--cn-vm");
501-
let vm_debug = args.iter().any(|arg| arg == "--cn-vm-debug");
502-
let vm_tip = args.iter().any(|arg| arg == "--cn-vm-tip");
503-
let vm_build = args.iter().any(|arg| arg == "--cn-vm-build");
544+
504545

505546
// v0.7.5新增:初始化内存池
506547
if memory_debug {
@@ -666,6 +707,18 @@ fn main() {
666707
if show_loop_stats {
667708
loop_memory::print_loop_performance_stats();
668709
}
710+
711+
// 🚀 显示记忆化缓存统计信息(仅在指定参数时显示)
712+
if show_memo_stats {
713+
if let Some(memo_stats) = interpreter::get_memo_stats() {
714+
memo_stats.print();
715+
}
716+
}
717+
718+
// 🚀 显示尾递归优化报告(仅在指定参数时显示)
719+
if show_tail_stats {
720+
interpreter::print_tail_recursion_report();
721+
}
669722
},
670723
Err(errors) => {
671724
// 显示所有错误信息

0 commit comments

Comments
 (0)