背景
PR1(#69)已建立批处理场景下的内存基准(16 个 1 MB 文件,threads=1 时峰值 RSS 约 950 MiB;threads=4 时约 2.4 GiB)。本文档记录的剩余问题:
- P1:批处理会在 lint 前加载全部文件内容
- P2:分组算法会复制、排序并扫描线程组(不仅最坏 O(n × threads),还有权重分配偏差)
目标
将 batchLint 改造为「主线程只发单文件路径 → worker 自行读取并 lint」,消除主线程对全部文件内容的驻留,同时为后续 PR3(输入字节上限)、PR4(worker 内 fix 写入)铺路。
范围
batchLint 向 Piscina 发送单文件路径;
- worker 读取并 lint 一个文件;
runTasksWithLimit 限制在途 worker 任务数;
- 删除
averaged-group.ts;
- 显式销毁 Piscina pool(try/finally);
- 保持现有 CLI、fix 写入位置、报告生成和退出码不变;
BatchLintItem 类型补 fixedResult 字段以保持现有 fix 模式行为不变。
验收条件
- worker payload 不包含
contentList,仅含 filePath;
- 最大在途任务数不超过
threads;
- worker 异常时 pool 仍会销毁;
- lint/fix 输出与调整前一致;
- 报告顺序由原「按分组顺序」改为「按文件输入顺序」(确定性更好);
- 使用 PR1 同一组参数记录前后 RSS 和耗时。
预期收益
PR1 基线(threads=1):972,620 KiB 峰值 RSS,11.17s wall time。
初步复测(PR2 实现,threads=1):约 832,600 KiB 峰值 RSS,10.5s wall time,RSS 下降约 140 MiB(~14%),主线程不再保留 16 MiB fileContentList 和 averagedGroup 分组结构。
threads=4 时 RSS 持平,wall time 略快约 3%(消除主线程 readFile 串行阶段和 averagedGroup 排序/分组开销)。剩余 RSS 主要由解析器 AST/临时对象贡献,留给 PR5(基准驱动)评估。
详见 docs/performance-security-analysis.md 中 PR2 复测结果与报告顺序说明小节。
背景
PR1(#69)已建立批处理场景下的内存基准(16 个 1 MB 文件,threads=1 时峰值 RSS 约 950 MiB;threads=4 时约 2.4 GiB)。本文档记录的剩余问题:
目标
将
batchLint改造为「主线程只发单文件路径 → worker 自行读取并 lint」,消除主线程对全部文件内容的驻留,同时为后续 PR3(输入字节上限)、PR4(worker 内 fix 写入)铺路。范围
batchLint向 Piscina 发送单文件路径;runTasksWithLimit限制在途 worker 任务数;averaged-group.ts;BatchLintItem类型补fixedResult字段以保持现有 fix 模式行为不变。验收条件
contentList,仅含filePath;threads;预期收益
PR1 基线(threads=1):972,620 KiB 峰值 RSS,11.17s wall time。
初步复测(PR2 实现,threads=1):约 832,600 KiB 峰值 RSS,10.5s wall time,RSS 下降约 140 MiB(~14%),主线程不再保留 16 MiB
fileContentList和averagedGroup分组结构。threads=4 时 RSS 持平,wall time 略快约 3%(消除主线程 readFile 串行阶段和 averagedGroup 排序/分组开销)。剩余 RSS 主要由解析器 AST/临时对象贡献,留给 PR5(基准驱动)评估。
详见
docs/performance-security-analysis.md中 PR2 复测结果与报告顺序说明小节。