updated scripts and pptx

This commit is contained in:
2026-06-30 02:11:00 +08:00
parent 18efd26881
commit d9d36e017f
7 changed files with 90 additions and 22 deletions

View File

@@ -0,0 +1 @@
,gh0s7,HakureiShrine,29.06.2026 18:09,/home/gh0s7/.local/share/onlyoffice;

View File

@@ -395,7 +395,8 @@ style: |
<div class="chips"> <div class="chips">
<span class="chip">Lab1Lab6 全部完成</span> <span class="chip">Lab1Lab6 全部完成</span>
<span class="chip">11 项功能测试通过</span> <span class="chip">21 项回归测试通过</span>
<span class="chip">全量测试 217.293s</span>
<span class="chip">实验验收汇报</span> <span class="chip">实验验收汇报</span>
</div> </div>
@@ -444,9 +445,9 @@ style: |
<div class="tech-item"><strong>前端</strong>ANTLR4 + Visitor 模式,词法/语法分析 → 语法树</div> <div class="tech-item"><strong>前端</strong>ANTLR4 + Visitor 模式,词法/语法分析 → 语法树</div>
<div class="tech-item"><strong>语义分析</strong>符号表 + 作用域栈 + 类型检查 + 名称绑定</div> <div class="tech-item"><strong>语义分析</strong>符号表 + 作用域栈 + 类型检查 + 名称绑定</div>
<div class="tech-item"><strong>中端 IR</strong>LLVM 风格 SSA IR含完整 use-def 链与 CFG</div> <div class="tech-item"><strong>中端 IR</strong>LLVM 风格 SSA IR含完整 use-def 链与 CFG</div>
<div class="tech-item"><strong>中端优化</strong>Mem2Reg · ConstFold/Prop · CSE · DCE · CFGSimplify · LICM</div> <div class="tech-item"><strong>中端优化</strong>Mem2Reg · ConstFold/Prop · CSE · Load CSE · DCE · CFGSimplify · LICM</div>
<div class="tech-item"><strong>后端 MIR</strong>机器级中间表示 → 虚拟寄存器 → 物理寄存器</div> <div class="tech-item"><strong>后端 MIR</strong>机器级中间表示 → 虚拟寄存器 → 物理寄存器</div>
<div class="tech-item"><strong>后端优化</strong>窥孔优化 · 冗余消除 · 寄存器别名感知</div> <div class="tech-item"><strong>后端优化</strong>窥孔优化 · 冗余消除 · 栈帧压缩 · SP 直接寻址 · 寄存器别名感知</div>
</div> </div>
</div> </div>
<div class="card"> <div class="card">
@@ -654,6 +655,42 @@ style: |
--- ---
# 性能优化专项:无硬编码的通用提速
<div class="grid-3">
<div class="card">
<h3>IR 层:基本块内 Load CSE</h3>
<p>在 <code>CSE</code> Pass 中增加同一基本块内的重复 <code>load</code> 消除:相同指针地址若未被 <code>store/call</code> 破坏,后续读取直接复用已有结果。该优化对 <code>A[i][j] * A[i][j]</code> 等循环密集模式收益明显,同时通过内存写入失效保证语义安全。</p>
</div>
<div class="card">
<h3>MIR 层:死栈槽删除 + 栈帧压缩</h3>
<p>后端扫描所有 <code>FrameIndex</code> 使用,删除从未被读取或取地址的临时栈槽写入;随后重新紧凑布局仍然活跃的栈槽,缩小 frame size减少无效栈空间和大偏移访存。</p>
</div>
<div class="card">
<h3>汇编层SP 直接寻址</h3>
<p>原先大偏移栈访问只能退化为 <code>ldr x10, =offset</code> + 寄存器偏移访存。优化后优先尝试 <code>[sp, #imm]</code> 正偏移寻址,大幅减少 literal load 和临时寄存器占用。</p>
</div>
</div>
<div class="grid-3" style="margin-top:14px;">
<div class="card">
<h3>重点样例收益</h3>
<p><code>2025-MYO-20.sy</code> 单测运行时间由约 <strong>130.8s</strong> 降至约 <strong>90.2s</strong>;生成汇编中大偏移栈访问 literal load 由 <strong>24</strong> 降至 <strong>0</strong>。</p>
</div>
<div class="card">
<h3>栈访问优化收益</h3>
<p><code>if-combine3.sy</code> 中 <code>ldr x10, =offset</code> 由 <strong>208</strong> 降至 <strong>0</strong>,汇编行数由约 <strong>923</strong> 行降至约 <strong>715</strong> 行,单测约 <strong>25s</strong> 完成。</p>
</div>
<div class="card">
<h3>全量测试结果</h3>
<p>取消所有 benchmark 特化和硬编码后,完整脚本 <code>./scripts/run_all_tests_verbose.sh</code> 从约 <strong>279.6s</strong> 降至 <strong>217.293s</strong>21 项测试全部通过。</p>
</div>
</div>
<p class="lead">核心原则:所有提速均来自<strong>通用 IR/MIR/汇编优化</strong>,不依赖文件名、测试名或特定输出常量,可接受代码检查。</p>
---
# 关键技术难点与突破 # 关键技术难点与突破
<div class="grid-3"> <div class="grid-3">
@@ -708,7 +745,7 @@ style: |
</div> </div>
<p class="lead" style="text-align:center;">全部 <strong>11 项功能测试用例</strong> 与 <strong>10 项性能测试用例</strong>(共 21 项)在<strong>优化开启</strong>条件下通过 <code>verify_asm.sh --run</code> 验证,输出与退出码 <strong>100% 匹配</strong>预期。</p> <p class="lead" style="text-align:center;">全部 <strong>11 项功能测试用例</strong> 与 <strong>10 项性能测试用例</strong>(共 21 项)在<strong>优化开启</strong>条件下通过 <code>./scripts/run_all_tests_verbose.sh</code> 验证;当前无硬编码优化版本总耗时 <strong>217.293 秒</strong>,输出与退出码 <strong>100% 匹配</strong>预期。</p>
<p class="mini" style="text-align:center;">验证链路SysY 源码 → IR 生成 → 标量优化 → 循环优化 → 指令选择 → 寄存器分配 → 窥孔优化 → AArch64 汇编 → QEMU 模拟运行 → 输出比对</p> <p class="mini" style="text-align:center;">验证链路SysY 源码 → IR 生成 → 标量优化 → 循环优化 → 指令选择 → 寄存器分配 → 窥孔优化 → AArch64 汇编 → QEMU 模拟运行 → 输出比对</p>
@@ -766,8 +803,9 @@ style: |
<li>✅ LLVM 风格 SSA IR 生成与打印</li> <li>✅ LLVM 风格 SSA IR 生成与打印</li>
<li>✅ AArch64 后端指令选择与汇编输出</li> <li>✅ AArch64 后端指令选择与汇编输出</li>
<li>✅ Mem2Reg + 五大标量优化 + LICM</li> <li>✅ Mem2Reg + 五大标量优化 + LICM</li>
<li>✅ 寄存器别名感知窥孔优化</li> <li>✅ Load CSE + 死栈槽删除 + 栈帧压缩</li>
<li>✅ 11 项功能测试全部通过</li> <li>✅ SP 直接寻址与寄存器别名感知窥孔优化</li>
<li>✅ 21 项完整回归测试全部通过</li>
</ul> </ul>
</div> </div>
<div class="card"> <div class="card">
@@ -782,7 +820,7 @@ style: |
</div> </div>
</div> </div>
<p class="lead">本项目已构建起一个<strong>结构清晰、可扩展、语义正确</strong>的 SysY 编译器框架,为后续继续深入编译器优化与并行化研究提供了坚实基础。</p> <p class="lead">本项目已构建起一个<strong>结构清晰、可扩展、语义正确</strong>的 SysY 编译器框架,并在不引入测例硬编码的前提下,将完整回归测试耗时优化至 <strong>217.293 秒</strong>为后续继续深入编译器优化与并行化研究提供了坚实基础。</p>
--- ---

Binary file not shown.

Binary file not shown.

View File

@@ -37,9 +37,9 @@
)[ )[
#text(weight: "bold", fill: rgb("#0f4c81"))[8 分钟汇报时间分配] \ #text(weight: "bold", fill: rgb("#0f4c81"))[8 分钟汇报时间分配] \
#set text(size: 9pt) #set text(size: 9pt)
- *页面时间*:封面 ~10s / 概述 ~25s / 技术栈 ~15s / Lab1 ~20s / Lab2 ~50s / Lab3 ~35s / Lab4 ~50s / Lab5 ~25s / Lab6 ~30s / 近期攻坚 ~35s / 难点 ~30s / 测试 ~20s / 分工 ~15s / 总结 ~25s / 致谢 ~5s。总计约 390 6.5 分钟演讲 + 1.5 分钟缓冲。 - *页面时间*:封面 ~10s / 概述 ~25s / 技术栈 ~15s / Lab1 ~20s / Lab2 ~45s / Lab3 ~30s / Lab4 ~45s / Lab5 ~25s / Lab6 ~25s / 近期攻坚 ~30s / 性能优化专项 ~45s / 难点 ~25s / 测试 ~20s / 分工 ~15s / 总结 ~20s / 致谢 ~5s。总计约 420 7 分钟演讲 + 1 分钟缓冲。
- *精讲原则*:每页只讲 1-2 个核心技术点,不展开细节。个必讲亮点:编译期/运行期分离、支配树+Mem2Reg、浮点位精确、寄存器别名、LICM。 - *精讲原则*:每页只讲 1-2 个核心技术点,不展开细节。个必讲亮点:编译期/运行期分离、支配树+Mem2Reg、浮点位精确、寄存器别名、LICM、无硬编码性能优化
- *语速*:中文约 260 字/分钟,本稿演讲正文约 2100 字。 - *语速*:中文约 260 字/分钟,本稿演讲正文约 2300 字。
] ]
#v(0.3cm) #v(0.3cm)
@@ -53,7 +53,7 @@
#block(width: 100%, breakable: true)[ #block(width: 100%, breakable: true)[
== 第 1 页:封面页(~10 秒) == 第 1 页:封面页(~10 秒)
*【逐字演讲稿】* 各位老师、同学们,下午好!我是程景愉。今天代表我们小组——程景愉、舒钰权、杨力嘉,汇报 SysY 编译器课程实验成果。我们实现了从 SysY AArch64 汇编的完整编译器,六个实验全部完成,11 测试通过 \ *【逐字演讲稿】* 各位老师、同学们,下午好!我是程景愉。今天代表我们小组——程景愉、舒钰权、杨力嘉,汇报 SysY 编译器课程实验成果。我们实现了从 SysY AArch64 汇编的完整编译器,六个实验全部完成,21 完整回归测试通过,并将全量测试耗时优化到 217.293 \
*【演讲技巧】* 站姿挺拔,声音洪亮。一句话自我介绍 + 一句话项目概括。 *【演讲技巧】* 站姿挺拔,声音洪亮。一句话自我介绍 + 一句话项目概括。
] ]
@@ -65,7 +65,7 @@
#block(width: 100%, breakable: true)[ #block(width: 100%, breakable: true)[
== 第 3 页:技术栈总览(~15 秒) == 第 3 页:技术栈总览(~15 秒)
*【逐字演讲稿】* 快速一览技术栈。前端 ANTLR4 + Visitor中端自研 SSA IR 含完整 use-def 链,中端优化实现了 Mem2Reg 五个标量 Pass LICM后端 MIR 汇编。LLVM 工具链验证 IRAArch64 交叉编译 + QEMU 验证汇编,全程自动化。 \ *【逐字演讲稿】* 快速一览技术栈。前端 ANTLR4 + Visitor中端自研 SSA IR 含完整 use-def 链,中端优化实现了 Mem2Reg五个标量 Pass、Load CSE LICM后端 MIR AArch64 汇编,并加入栈帧压缩和 SP 直接寻址等后端优化。LLVM 工具链验证 IRAArch64 交叉编译 + QEMU 验证汇编,全程自动化。 \
*【演讲技巧】* 快速全景扫描15 秒带过。 *【演讲技巧】* 快速全景扫描15 秒带过。
] ]
@@ -128,31 +128,43 @@
] ]
#block(width: 100%, breakable: true)[ #block(width: 100%, breakable: true)[
== 第 10 页:关键技术难点与突破(~30 秒) == 第 10 页:性能优化专项:无硬编码的通用提速(~45 秒)
*【逐字演讲稿】* 这里重点汇报基础六个 Lab 之外,我们最后针对性能测试做的通用优化。要求是不能硬编码测试名、文件名或输出常量,所以我们只保留可以解释为编译器正常优化的方案。
第一是 IR 层 Load CSE同一基本块内如果两次 load 来自同一个指针,并且中间没有 store 或 call 破坏内存,就直接复用第一次 load 的结果。这个优化对 `A[i][j] * A[i][j]` 这类循环密集表达式非常有效。
第二是 MIR 层死栈槽删除和栈帧压缩。删除从未被读取的临时栈槽后,重新紧凑布局活跃 frame slot减少大负偏移访存。
第三是汇编层 SP 直接寻址。原先大偏移访问会生成 `ldr x10, =offset` 再访存;优化后能用 `[sp, #imm]` 就直接编码。效果上,`2025-MYO-20.sy` 单测从约 130.8 秒降到约 90.2 秒,`if-combine3.sy` 的大偏移 literal load 208 次降为 0。完整脚本从约 279.6 秒降到 217.293 21 项测试全部通过。 \
*【演讲技巧】* 这一页是性能亮点,强调“无硬编码”和“可解释为通用优化”。数字要讲清楚。
]
#block(width: 100%, breakable: true)[
== 第 11 页:关键技术难点与突破(~25 秒)
*【逐字演讲稿】* 六大技术挑战总结。编译期/运行期分离——常量求值绝不碰 IRBuilder。数组语义三层拆分——标量、聚合、指针退化严格区分。浮点精度保全——从常量折叠到 .word 汇编全链路位精确。SSA 一致性——每个改变 CFG 的 Pass 必须同步维护 Phi 边。后端指针安全——预分配容量、64 位强制 X 寄存器、栈槽静态扫描。支配树鲁棒性——不可达节点和自环必须优雅阻断。这六点是优化开启后仍保持语义正确的基石。 \ *【逐字演讲稿】* 六大技术挑战总结。编译期/运行期分离——常量求值绝不碰 IRBuilder。数组语义三层拆分——标量、聚合、指针退化严格区分。浮点精度保全——从常量折叠到 .word 汇编全链路位精确。SSA 一致性——每个改变 CFG 的 Pass 必须同步维护 Phi 边。后端指针安全——预分配容量、64 位强制 X 寄存器、栈槽静态扫描。支配树鲁棒性——不可达节点和自环必须优雅阻断。这六点是优化开启后仍保持语义正确的基石。 \
*【演讲技巧】* 快速过六个要点,手指逐一指向卡片。 *【演讲技巧】* 快速过六个要点,手指逐一指向卡片。
] ]
#block(width: 100%, breakable: true)[ #block(width: 100%, breakable: true)[
== 第 11 页:测试验证结果(~20 秒) == 第 12 页:测试验证结果(~20 秒)
*【逐字演讲稿】* 全部 11 项功能测试与 10 项性能测试在优化全开条件下通过21 个用例输出与退出码 100% 匹配。覆盖从 simple_add 到递归图着色95_float 浮点综合测试。特别强调:这是在 Mem2Reg + 五个 Pass + LICM 全部开启下通过的——优化管线在提升性能的同时保证了语义正确。验证链路SysY 源码 → IR → 优化 → AArch64 汇编 → QEMU 模拟 → 输出比对。 \ *【逐字演讲稿】* 全部 11 项功能测试与 10 项性能测试在优化全开条件下通过21 个用例输出与退出码 100% 匹配。当前无硬编码优化版本完整脚本耗时 217.293 秒。覆盖从 simple_add 到递归图着色95_float 浮点综合测试,再到 2025-MYO-20 等性能测试。特别强调:这是在 Mem2Reg五个 PassLICM、Load CSE 和后端栈优化全部开启下通过的——优化管线在提升性能的同时保证了语义正确。验证链路SysY 源码 → IR → 优化 → AArch64 汇编 → QEMU 模拟 → 输出比对。 \
*【演讲技巧】* 强调"优化全开"和"100% 匹配"。 *【演讲技巧】* 强调"优化全开"、"21/21"和"217.293 秒"。
] ]
#block(width: 100%, breakable: true)[ #block(width: 100%, breakable: true)[
== 第 12 页:人员分工(~15 秒) == 第 13 页:人员分工(~15 秒)
*【逐字演讲稿】* 三人分工。我负责中端优化——Lab2 IR 生成、Lab4 支配树与全部 Pass、Lab6 LICM。舒钰权负责 Lab1 文法扩展和 Lab3 AArch64 后端,攻克了浮点位精确等底层难题。杨力嘉负责 Lab5 窥孔优化与全量测试回归,在寄存器别名感知方面做出关键贡献。通过 Git 分支 + MR + Code Review 完成协作。 \ *【逐字演讲稿】* 三人分工。我负责中端优化——Lab2 IR 生成、Lab4 支配树与全部 Pass、Lab6 LICM。舒钰权负责 Lab1 文法扩展和 Lab3 AArch64 后端,攻克了浮点位精确等底层难题。杨力嘉负责 Lab5 窥孔优化与全量测试回归,在寄存器别名感知方面做出关键贡献。通过 Git 分支 + MR + Code Review 完成协作。 \
*【演讲技巧】* 真诚肯定组员贡献。 *【演讲技巧】* 真诚肯定组员贡献。
] ]
#block(width: 100%, breakable: true)[ #block(width: 100%, breakable: true)[
== 第 13 页:实验总结与展望(~25 秒) == 第 14 页:实验总结与展望(~20 秒)
*【逐字演讲稿】* 核心成果:构建了一个结构清晰、语义正确、可扩展的 SysY 编译器框架。六个实验覆盖前端到后端全环节在支配树、SSA 构建、Phi 降低、浮点位精确、寄存器别名、LICM 等关键技术上做了深入实现。可继续方向:寄存器分配升级为图着色/线性扫描,循环优化扩展到强度削弱和展开,中端引入 GVN/PRE。通过这六个实验,我们对编译器三层次架构和 SSA 优化有了系统性理解,为今后程序语言和系统优化方向的研究打下了基础。 \ *【逐字演讲稿】* 核心成果:构建了一个结构清晰、语义正确、可扩展的 SysY 编译器框架。六个实验覆盖前端到后端全环节在支配树、SSA 构建、Phi 降低、浮点位精确、寄存器别名、LICM 等关键技术上做了深入实现;同时额外完成了 Load CSE、栈帧压缩和 SP 直接寻址等通用性能优化,把完整回归测试稳定压到 217.293 秒。可继续方向:寄存器分配升级为图着色/线性扫描,循环优化扩展到强度削弱和展开,中端引入 GVN/PRE。 \
*【演讲技巧】* 直视评委,展示热情和清晰规划。 *【演讲技巧】* 直视评委,展示热情和清晰规划。
] ]
#block(width: 100%, breakable: true)[ #block(width: 100%, breakable: true)[
== 第 14 页:致谢与 Q&A == 第 15 页:致谢与 Q&A
*【逐字演讲稿】* 感谢各位老师和同学的聆听!从语法树到 AArch64 汇编,从 SSA 优化到循环不变式外提——我们构建了一个完整、正确、可扩展的 SysY 编译器。接下来是答辩与提问环节,敬请批评指正!谢谢! *【逐字演讲稿】* 感谢各位老师和同学的聆听!从语法树到 AArch64 汇编,从 SSA 优化到循环不变式外提——我们构建了一个完整、正确、可扩展的 SysY 编译器。接下来是答辩与提问环节,敬请批评指正!谢谢!
#v(0.3cm) #v(0.3cm)
@@ -208,8 +220,8 @@
*应答*:一是在 Lab1/2 之间引入独立 AST 层解耦文法与下游;二是在 Lab3 就用虚拟寄存器,避免后续从栈槽模型重构。 *应答*:一是在 Lab1/2 之间引入独立 AST 层解耦文法与下游;二是在 Lab3 就用虚拟寄存器,避免后续从栈槽模型重构。
#v(0.1cm) #v(0.1cm)
*问题十:性能怎么样?* \ *问题十:性能怎么样?做了哪些非基础 Lab 优化?* \
*应答*:教学编译器追求语义正确优先。优化前因栈槽冗余不如 GCC -O0。全量优化开启后循环密集用例有明显提升。要达到 GCC 水平不现实,但已验证了优化管线的语义正确性 *应答*:教学编译器仍然以语义正确优先但我们额外做了三类通用性能优化IR 层基本块内 Load CSEMIR 层死栈槽删除与栈帧压缩,汇编层 SP 直接寻址。取消所有测例硬编码后,完整脚本从约 279.6 秒降到 217.293 秒;其中 2025-MYO-20 单测从约 130.8 秒降到约 90.2 秒if-combine3 的大偏移 literal load 从 208 次降到 0
#v(0.1cm) #v(0.1cm)
*问题十一:能在真机上运行吗?* \ *问题十一:能在真机上运行吗?* \

View File

View File

@@ -17,6 +17,13 @@ MAGENTA='\e[35m'
BOLD='\e[1m' BOLD='\e[1m'
RESET='\e[0m' RESET='\e[0m'
elapsed_seconds() {
local start_ms=$1
local end_ms
end_ms=$(date +%s%3N)
awk "BEGIN { printf \"%.3f\", ($end_ms - $start_ms) / 1000 }"
}
test_dir="$(pwd)/test/test_case" test_dir="$(pwd)/test/test_case"
compiler="$(pwd)/build/bin/compiler" compiler="$(pwd)/build/bin/compiler"
out_dir="$(pwd)/test/test_result/asm" out_dir="$(pwd)/test/test_result/asm"
@@ -63,6 +70,7 @@ for test_file in $test_files; do
test_name=$(basename "$test_file") test_name=$(basename "$test_file")
stem=${test_name%.sy} stem=${test_name%.sy}
dir_name=$(basename "$(dirname "$test_file")") dir_name=$(basename "$(dirname "$test_file")")
case_start_ms=$(date +%s%3N)
echo -e "\n${BOLD}[RUNNING]${RESET} ${MAGENTA}${dir_name}/${test_name}${RESET} ..." echo -e "\n${BOLD}[RUNNING]${RESET} ${MAGENTA}${dir_name}/${test_name}${RESET} ..."
@@ -81,6 +89,7 @@ for test_file in $test_files; do
echo -e "${RED}✗ 失败${RESET}" echo -e "${RED}✗ 失败${RESET}"
((failed_count++)) ((failed_count++))
failed_tests+=("${dir_name}/${test_name} (Parsing)") failed_tests+=("${dir_name}/${test_name} (Parsing)")
echo -e " -> ${CYAN}Case elapsed: $(elapsed_seconds "$case_start_ms")s${RESET}"
continue continue
fi fi
@@ -96,6 +105,7 @@ for test_file in $test_files; do
echo -e "${RED}✗ 失败${RESET}" echo -e "${RED}✗ 失败${RESET}"
((failed_count++)) ((failed_count++))
failed_tests+=("${dir_name}/${test_name} (IR/Optimizations)") failed_tests+=("${dir_name}/${test_name} (IR/Optimizations)")
echo -e " -> ${CYAN}Case elapsed: $(elapsed_seconds "$case_start_ms")s${RESET}"
continue continue
fi fi
@@ -107,6 +117,7 @@ for test_file in $test_files; do
echo -e "${RED}✗ 失败${RESET}" echo -e "${RED}✗ 失败${RESET}"
((failed_count++)) ((failed_count++))
failed_tests+=("${dir_name}/${test_name} (Backend/Peephole)") failed_tests+=("${dir_name}/${test_name} (Backend/Peephole)")
echo -e " -> ${CYAN}Case elapsed: $(elapsed_seconds "$case_start_ms")s${RESET}"
continue continue
fi fi
@@ -118,6 +129,7 @@ for test_file in $test_files; do
echo -e "${RED}✗ 失败 (空文件)${RESET}" echo -e "${RED}✗ 失败 (空文件)${RESET}"
((failed_count++)) ((failed_count++))
failed_tests+=("${dir_name}/${test_name} (Asm empty)") failed_tests+=("${dir_name}/${test_name} (Asm empty)")
echo -e " -> ${CYAN}Case elapsed: $(elapsed_seconds "$case_start_ms")s${RESET}"
continue continue
fi fi
@@ -129,6 +141,7 @@ for test_file in $test_files; do
echo -e "${RED}✗ 失败 (链接错误)${RESET}" echo -e "${RED}✗ 失败 (链接错误)${RESET}"
((failed_count++)) ((failed_count++))
failed_tests+=("${dir_name}/${test_name} (Linking)") failed_tests+=("${dir_name}/${test_name} (Linking)")
echo -e " -> ${CYAN}Case elapsed: $(elapsed_seconds "$case_start_ms")s${RESET}"
continue continue
fi fi
@@ -150,6 +163,7 @@ for test_file in $test_files; do
echo -e "${YELLOW}! 跳过比较 (性能测试运行超时)${RESET}" echo -e "${YELLOW}! 跳过比较 (性能测试运行超时)${RESET}"
echo -e "${GREEN}${BOLD}[SUCCESS]${RESET} ${test_name} 测试通过 (编译与部分执行已验证)" echo -e "${GREEN}${BOLD}[SUCCESS]${RESET} ${test_name} 测试通过 (编译与部分执行已验证)"
((success_count++)) ((success_count++))
echo -e " -> ${CYAN}Case elapsed: $(elapsed_seconds "$case_start_ms")s${RESET}"
continue continue
fi fi
@@ -174,6 +188,7 @@ for test_file in $test_files; do
echo -e "${GREEN}✓ 匹配成功${RESET}" echo -e "${GREEN}✓ 匹配成功${RESET}"
echo -e "${GREEN}${BOLD}[SUCCESS]${RESET} ${test_name} 测试通过!" echo -e "${GREEN}${BOLD}[SUCCESS]${RESET} ${test_name} 测试通过!"
((success_count++)) ((success_count++))
echo -e " -> ${CYAN}Case elapsed: $(elapsed_seconds "$case_start_ms")s${RESET}"
else else
echo -e "${RED}✗ 匹配失败${RESET}" echo -e "${RED}✗ 匹配失败${RESET}"
echo -e "${RED} [ERROR] 实际输出与期望不一致:${RESET}" echo -e "${RED} [ERROR] 实际输出与期望不一致:${RESET}"
@@ -183,10 +198,12 @@ for test_file in $test_files; do
cat "$actual_file" | sed 's/^/ /' cat "$actual_file" | sed 's/^/ /'
((failed_count++)) ((failed_count++))
failed_tests+=("${dir_name}/${test_name} (Output Mismatch)") failed_tests+=("${dir_name}/${test_name} (Output Mismatch)")
echo -e " -> ${CYAN}Case elapsed: $(elapsed_seconds "$case_start_ms")s${RESET}"
fi fi
else else
echo -e "${YELLOW}! 跳过比较 (未找到 .out 文件)${RESET}" echo -e "${YELLOW}! 跳过比较 (未找到 .out 文件)${RESET}"
((success_count++)) ((success_count++))
echo -e " -> ${CYAN}Case elapsed: $(elapsed_seconds "$case_start_ms")s${RESET}"
fi fi
done done