|
| 1 | +# CodeNothing --cn-time 功能实现 |
| 2 | + |
| 3 | +## 📋 功能概述 |
| 4 | + |
| 5 | +为CodeNothing添加了`--cn-time`命令行标识,用于显示程序运行时间。该功能提供精确的毫秒级时间测量,并根据时间长度自动选择合适的显示格式。 |
| 6 | + |
| 7 | +## 🚀 功能特性 |
| 8 | + |
| 9 | +### 时间测量范围 |
| 10 | +- **毫秒级精度**: 使用`std::time::Instant`提供高精度时间测量 |
| 11 | +- **全程覆盖**: 从文件预处理开始到程序执行完成的完整时间 |
| 12 | +- **错误情况支持**: 即使解析失败也会显示解析时间 |
| 13 | + |
| 14 | +### 智能格式化 |
| 15 | +根据执行时间长度自动选择最合适的显示格式: |
| 16 | + |
| 17 | +#### 1. 毫秒格式 (< 1秒) |
| 18 | +``` |
| 19 | +执行时间: 123.456 ms |
| 20 | +``` |
| 21 | + |
| 22 | +#### 2. 秒格式 (1秒 - 1分钟) |
| 23 | +``` |
| 24 | +执行时间: 1500.500 ms [1.5 s] |
| 25 | +``` |
| 26 | + |
| 27 | +#### 3. 分钟格式 (≥ 1分钟) |
| 28 | +``` |
| 29 | +执行时间: 125000.000 ms [2 min 5.0 s] |
| 30 | +``` |
| 31 | + |
| 32 | +## 🔧 技术实现 |
| 33 | + |
| 34 | +### 1. 时间测量逻辑 |
| 35 | +```rust |
| 36 | +// 开始计时(如果启用了时间显示) |
| 37 | +let start_time = if show_time { Some(Instant::now()) } else { None }; |
| 38 | + |
| 39 | +// ... 程序执行 ... |
| 40 | + |
| 41 | +// 显示执行时间(如果启用了时间显示) |
| 42 | +if let Some(start) = start_time { |
| 43 | + let duration = start.elapsed(); |
| 44 | + let duration_ms = duration.as_secs_f64() * 1000.0; |
| 45 | + println!("执行时间: {}", format_execution_time(duration_ms)); |
| 46 | +} |
| 47 | +``` |
| 48 | + |
| 49 | +### 2. 格式化函数 |
| 50 | +```rust |
| 51 | +fn format_execution_time(duration_ms: f64) -> String { |
| 52 | + if duration_ms < 1000.0 { |
| 53 | + // 毫秒格式 |
| 54 | + format!("{:.3} ms", duration_ms) |
| 55 | + } else if duration_ms < 60000.0 { |
| 56 | + // 秒格式 |
| 57 | + let seconds = duration_ms / 1000.0; |
| 58 | + format!("{:.3} ms [{:.1} s]", duration_ms, seconds) |
| 59 | + } else { |
| 60 | + // 分钟格式 |
| 61 | + let total_seconds = duration_ms / 1000.0; |
| 62 | + let minutes = (total_seconds / 60.0).floor(); |
| 63 | + let seconds = total_seconds % 60.0; |
| 64 | + format!("{:.3} ms [{:.0} min {:.1} s]", duration_ms, minutes, seconds) |
| 65 | + } |
| 66 | +} |
| 67 | +``` |
| 68 | + |
| 69 | +### 3. 参数解析 |
| 70 | +```rust |
| 71 | +let show_time = args.iter().any(|arg| arg == "--cn-time"); |
| 72 | +``` |
| 73 | + |
| 74 | +## 📝 使用示例 |
| 75 | + |
| 76 | +### 基本用法 |
| 77 | +```bash |
| 78 | +# 显示执行时间 |
| 79 | +cargo run -- examples/simple_test.cn --cn-time |
| 80 | + |
| 81 | +# 输出示例: |
| 82 | +# === 程序输出 === |
| 83 | +# Hello, World! |
| 84 | +# 执行时间: 15.234 ms |
| 85 | +``` |
| 86 | + |
| 87 | +### 组合使用 |
| 88 | +```bash |
| 89 | +# 同时显示返回值和执行时间 |
| 90 | +cargo run -- examples/test.cn --cn-return --cn-time |
| 91 | + |
| 92 | +# 输出示例: |
| 93 | +# === 程序输出 === |
| 94 | +# 程序执行结果: 42 |
| 95 | +# 执行时间: 8.567 ms |
| 96 | +``` |
| 97 | + |
| 98 | +### 解析错误情况 |
| 99 | +```bash |
| 100 | +# 解析失败时也显示时间 |
| 101 | +cargo run -- examples/syntax_error.cn --cn-time |
| 102 | + |
| 103 | +# 输出示例: |
| 104 | +# 发现 1 个解析错误: |
| 105 | +# 错误 1: 期望 ';', 但得到了 '.' |
| 106 | +# |
| 107 | +# 可以使用 --cn-parser 选项查看更详细的解析信息。 |
| 108 | +# 由于存在解析错误,程序无法执行。 |
| 109 | +# 解析时间: 6.123 ms |
| 110 | +``` |
| 111 | + |
| 112 | +## 🎯 应用场景 |
| 113 | + |
| 114 | +### 1. 性能分析 |
| 115 | +- 测量程序执行效率 |
| 116 | +- 比较不同实现的性能 |
| 117 | +- 识别性能瓶颈 |
| 118 | + |
| 119 | +### 2. 开发调试 |
| 120 | +- 验证优化效果 |
| 121 | +- 监控编译时间变化 |
| 122 | +- 分析复杂程序的执行时间 |
| 123 | + |
| 124 | +### 3. 基准测试 |
| 125 | +- 建立性能基线 |
| 126 | +- 回归测试中的性能验证 |
| 127 | +- 不同版本间的性能对比 |
| 128 | + |
| 129 | +## 📊 测试结果 |
| 130 | + |
| 131 | +### 格式化测试 |
| 132 | +``` |
| 133 | +时间格式化测试: |
| 134 | +5.123 ms -> 5.123 ms |
| 135 | +123.456 ms -> 123.456 ms |
| 136 | +999.999 ms -> 999.999 ms |
| 137 | +1000.0 ms -> 1000.000 ms [1.0 s] |
| 138 | +1500.5 ms -> 1500.500 ms [1.5 s] |
| 139 | +30000.0 ms -> 30000.000 ms [30.0 s] |
| 140 | +59999.9 ms -> 59999.900 ms [60.0 s] |
| 141 | +60000.0 ms -> 60000.000 ms [1 min 0.0 s] |
| 142 | +90000.0 ms -> 90000.000 ms [1 min 30.0 s] |
| 143 | +125000.0 ms -> 125000.000 ms [2 min 5.0 s] |
| 144 | +3600000.0 ms -> 3600000.000 ms [60 min 0.0 s] |
| 145 | +``` |
| 146 | + |
| 147 | +### 实际运行测试 |
| 148 | +```bash |
| 149 | +# 简单程序 |
| 150 | +cargo run -- examples/simple_enhanced_pointer_test.cn --cn-time |
| 151 | +# 输出: 执行时间: 32.782 ms |
| 152 | + |
| 153 | +# 复杂程序 |
| 154 | +cargo run -- examples/pointer_test.cn --cn-time |
| 155 | +# 输出: 执行时间: 31.362 ms |
| 156 | + |
| 157 | +# 解析错误 |
| 158 | +cargo run -- examples/advanced_pointer_syntax_test.cn --cn-time |
| 159 | +# 输出: 解析时间: 6.611 ms |
| 160 | +``` |
| 161 | + |
| 162 | +## 🔄 兼容性 |
| 163 | + |
| 164 | +### 向后兼容 |
| 165 | +- ✅ 不影响现有功能 |
| 166 | +- ✅ 可选功能,默认不启用 |
| 167 | +- ✅ 与其他参数完全兼容 |
| 168 | + |
| 169 | +### 参数组合 |
| 170 | +- ✅ `--cn-time` + `--cn-return`: 显示返回值和时间 |
| 171 | +- ✅ `--cn-time` + `--cn-parser`: 显示解析信息和时间 |
| 172 | +- ✅ `--cn-time` + `--cn-debug`: 显示调试信息和时间 |
| 173 | +- ✅ 支持所有现有参数的任意组合 |
| 174 | + |
| 175 | +## 🎉 总结 |
| 176 | + |
| 177 | +`--cn-time`功能为CodeNothing提供了专业级的时间测量能力,具有以下优势: |
| 178 | + |
| 179 | +1. **精确测量**: 毫秒级精度,覆盖完整执行周期 |
| 180 | +2. **智能显示**: 根据时间长度自动选择最佳格式 |
| 181 | +3. **全面支持**: 正常执行和错误情况都支持 |
| 182 | +4. **易于使用**: 简单的命令行参数,即开即用 |
| 183 | +5. **完全兼容**: 与现有功能无缝集成 |
| 184 | + |
| 185 | +这个功能对于性能分析、开发调试和基准测试都非常有用,是CodeNothing工具链的重要补充。 |
0 commit comments