课题6:编译器性能测试套件

难度:中

概述:设计一组基准测试程序(DSL用例),自动化执行编译、模拟运行、对比预期输出,生成性能报告。该套件用于持续验证编译器的正确性和性能变化。

详细任务: 1. 收集或编写15~20个DSL测试程序,覆盖算术、分支、循环、函数调用(如支持)。 2. 每个程序提供预期输出(标准输出或返回值)和描述。 3. 编写Python测试脚本:遍历测试目录,调用编译器生成汇编,再调用tinyfive.py模拟执行,捕获输出。 4. 对比实际输出与预期输出,统计通过/失败数量。 5. 从模拟器中提取指令总数(或执行周期估算),记录每个用例的性能数据。 6. 生成Markdown或HTML格式的测试报告,包含表格和性能图表。 7. 支持--benchmark模式,重复运行取平均值,检测性能退化。

交付产物: - 包含20个以上测试用例的目录 - 自动化测试脚本 run_tests.py - 测试报告模板和示例输出 - 使用文档(如何添加新用例、如何解读报告)

12周每周目标: - W1:学习项目编译命令和tinyfive.py用法,手动测试3个简单DSL程序,记录输出和指令数。 - W2:编写Python脚本,使用subprocess自动调用编译器和模拟器,捕获stdout。 - W3:设计测试用例格式(文件夹包含.dsl、.expected、.desc),编写5个算术测试用例。 - W4:实现测试驱动:遍历用例,对比输出,输出PASS/FAIL表格。 - W5:从模拟器提取指令数(如果支持--stats,否则解析日志)。将指令数加入报告。 - W6:使用matplotlib绘制性能条形图。使用jinja2模板生成HTML报告。 - W7:扩充测试用例到15个,覆盖分支和循环。 - W8:增加时间测量(time.perf_counter),输出到报告。 - W9:实现回归测试模式:保存基准结果,下次运行时对比并提示性能退化(阈值5%)。 - W10:添加--benchmark选项,重复运行3次取平均值,输出置信区间。 - W11:集成到CI(如GitHub Actions)示例,每次push自动运行测试套件。 - W12:撰写完整文档(如何添加新测试、命令行参数、报告解读),准备演示。