============================================================ 脚本优化总结(2026-04) ============================================================ 一、架构分离 ──────────────────────────────────────────────────────────── · run_baseline.sh 成为唯一负责计算 GCC -O2 基线的脚本; 其余所有脚本(lab3_build_test.sh、analyze_case.sh)只读 TSV,不再重复运行 GCC,避免重复耗时。 · 基线输出目录镜像测试用例的相对路径结构,例如: output/baseline/test_case/functional/65_color.gcc.s output/baseline/class_test_case/h_functional/11_BST.gcc.s TSV 键与目录结构对齐:class_test_case/h_functional/11_BST 二、SysY → C 编译兼容性修复(run_baseline.sh) ──────────────────────────────────────────────────────────── · const int 全局数组维度问题 C 模式下 const int N=10; int a[N]; 属于 VLA(非法于文件域)。 用 Python3 预处理将 const int NAME=EXPR; 转换为: #define NAME ((int)(EXPR)) 同时支持多声明符写法:const int A=1, B=2; · sylib 链接方式 预编译 sylib.o(-x c),用 -include sylib.h 注入声明; 链接命令用 -x none 在 .o 前重置语言标志,防止 ELF 被 当作 C 源文件解析(stray '\177' 错误)。 · C++ 关键字冲突 部分 SysY 测试用例用 delete/new/class 作函数名; -x c 模式下这些不是关键字,编译正常通过。 · 枚举浮点值 enum { MAX = 1e9 }; 枚举成员必须是整数常量,Python3 预处理同样将其转为 #define MAX ((int)(1e9))。 三、计时精度与准确性 ──────────────────────────────────────────────────────────── · 全面弃用 /usr/bin/time:非零退出时会向输出文件写入 "Command exited with non-zero status N",污染时间值。 · 改用 date +%s%N 纳秒手动计时: _t0=$(date +%s%N) ... 运行命令 ... _t1=$(date +%s%N) elapsed=$(awk "BEGIN{printf \"%.5f\", $((t1-t0)) / 1e9}") · 所有时间输出统一为 5 位小数(秒),加速比同样 5 位小数。 四、分段计时(verify_asm.sh + lab3_build_test.sh) ──────────────────────────────────────────────────────────── · verify_asm.sh 新增 --timing-out 选项,运行结束后 向文件写入: compile_ns=<纳秒> run_ns=<纳秒> · lab3_build_test.sh 读取 timing 文件,将编译耗时与运行耗时 分开显示: PASS test_case/functional/65_color [compile=0.31416s run=0.18804s] · 加速比只使用运行时间(run_ns),排除编译器启动开销。 五、性能排行榜(lab3_build_test.sh) ──────────────────────────────────────────────────────────── · 测试结束后输出双排序表格: Sort 1:加速比升序(最需优化的用例排最前) Sort 2:我方用时降序(绝对耗时最高的排最前) 每行格式: <用例名> <我方时间> <加速比>x 六、analyze_case.sh 修复 ──────────────────────────────────────────────────────────── · 基线查找键从裸 stem(65_color)改为完整路径键 (test_case/functional/65_color),与 TSV 格式对齐, 消除 "WARNING: no baseline entry" 误报。 · run_and_time 函数的 rpt_color 输出重定向到 stderr, 防止 ANSI 转义码被命令替换($())捕获后传入 awk, 消除 "fatal: error: invalid character '\033'" 错误。 ============================================================ 脚本列表 ============================================================ run_baseline.sh 计算所有用例的 GCC -O2 基线,结果存入 output/baseline/gcc_timing.tsv 用法: ./scripts/run_baseline.sh [--update] --update 清空重算全部条目 lab3_build_test.sh 构建编译器,跑全部用例,输出加速比排行榜 用法: ./scripts/lab3_build_test.sh verify_asm.sh 验证单个用例的汇编正确性 用法: ./scripts/verify_asm.sh [input.in] \ [expected.out] [timeout] [--timing-out file] analyze_case.sh 单用例深度分析(IR/ASM/计时/与基线对比) 用法: ./scripts/analyze_case.sh [output_dir] clean_outputs.sh 清理 output/ 目录下的分析结果 用法: ./scripts/clean_outputs.sh ============================================================