课题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:撰写完整文档(如何添加新测试、命令行参数、报告解读),准备演示。