@@ -3,6 +3,7 @@ use std::fs::File;
33use std:: io:: Read ;
44use std:: path:: { Path , PathBuf } ;
55use std:: collections:: HashMap ;
6+ use std:: time:: Instant ;
67
78mod ast;
89mod 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+
162178fn 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