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

Commit 4da738d

Browse files
committed
新增执行时间格式化功能,优化命令行用法提示,支持显示程序执行时间
1 parent 8311e5c commit 4da738d

File tree

1 file changed

+50
-3
lines changed

1 file changed

+50
-3
lines changed

src/main.rs

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use std::fs::File;
33
use std::io::Read;
44
use std::path::{Path, PathBuf};
55
use std::collections::HashMap;
6+
use std::time::Instant;
67

78
mod ast;
89
mod parser;
@@ -159,20 +160,49 @@ fn init_program() -> Program {
159160
}
160161
}
161162

163+
// 格式化执行时间
164+
fn format_execution_time(duration_ms: f64) -> String {
165+
if duration_ms < 1000.0 {
166+
format!("{:.3} ms", duration_ms)
167+
} else if duration_ms < 60000.0 {
168+
let seconds = duration_ms / 1000.0;
169+
format!("{:.3} ms [{:.1} s]", duration_ms, seconds)
170+
} else {
171+
let total_seconds = duration_ms / 1000.0;
172+
let minutes = (total_seconds / 60.0).floor();
173+
let seconds = total_seconds % 60.0;
174+
format!("{:.3} ms [{:.0} min {:.1} s]", duration_ms, minutes, seconds)
175+
}
176+
}
177+
162178
fn main() {
163179
let args: Vec<String> = std::env::args().collect();
164180

165181
if args.len() < 2 {
166-
println!("用法: {} <文件路径> [--cn-parser] [--cn-debug]", args[0]);
182+
println!("用法: {} <文件路径> [选项]", args[0]);
183+
println!("");
184+
println!("选项:");
185+
println!(" --cn-parser 显示详细的解析信息");
186+
println!(" --cn-lexer 显示词法分析信息");
187+
println!(" --cn-debug 启用调试模式");
188+
println!(" --cn-return 显示程序执行结果");
189+
println!(" --cn-query-jit 显示JIT编译统计信息");
190+
println!(" --cn-time 显示程序执行时间");
191+
println!("");
192+
println!("示例:");
193+
println!(" {} hello.cn", args[0]);
194+
println!(" {} hello.cn --cn-time", args[0]);
195+
println!(" {} hello.cn --cn-return --cn-time", args[0]);
167196
return;
168197
}
169-
198+
170199
let file_path = &args[1];
171200
let debug_parser = args.iter().any(|arg| arg == "--cn-parser");
172201
let debug_lexer = args.iter().any(|arg| arg == "--cn-lexer");
173202
let debug_mode = args.iter().any(|arg| arg == "--cn-debug");
174203
let show_return = args.iter().any(|arg| arg == "--cn-return");
175204
let query_jit = args.iter().any(|arg| arg == "--cn-query-jit");
205+
let show_time = args.iter().any(|arg| arg == "--cn-time");
176206

177207
// 如果是调试模式,先调试io库中的函数
178208
if debug_mode {
@@ -186,7 +216,10 @@ fn main() {
186216

187217
// 创建文件预处理器
188218
let mut preprocessor = FilePreprocessor::new();
189-
219+
220+
// 开始计时(如果启用了时间显示)
221+
let start_time = if show_time { Some(Instant::now()) } else { None };
222+
190223
// 预处理文件,处理所有导入(不传递父目录,让process_file自己处理相对路径)
191224
match preprocessor.process_file(file_path, None) {
192225
Ok(processed_content) => {
@@ -231,6 +264,13 @@ fn main() {
231264
if query_jit && jit::was_jit_used() {
232265
print!("{}", jit::jit_stats());
233266
}
267+
268+
// 显示执行时间(如果启用了时间显示)
269+
if let Some(start) = start_time {
270+
let duration = start.elapsed();
271+
let duration_ms = duration.as_secs_f64() * 1000.0;
272+
println!("执行时间: {}", format_execution_time(duration_ms));
273+
}
234274
},
235275
Err(errors) => {
236276
// 显示所有错误信息
@@ -250,6 +290,13 @@ fn main() {
250290

251291
println!("\n可以使用 --cn-parser 选项查看更详细的解析信息。");
252292
println!("由于存在解析错误,程序无法执行。");
293+
294+
// 显示执行时间(如果启用了时间显示)
295+
if let Some(start) = start_time {
296+
let duration = start.elapsed();
297+
let duration_ms = duration.as_secs_f64() * 1000.0;
298+
println!("解析时间: {}", format_execution_time(duration_ms));
299+
}
253300
}
254301
}
255302
},

0 commit comments

Comments
 (0)