Skip to content

PR2: 移除批处理全量预读取和静态分组 #73

Description

@luojiyin1987

背景

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 fileContentListaveragedGroup 分组结构。

threads=4 时 RSS 持平,wall time 略快约 3%(消除主线程 readFile 串行阶段和 averagedGroup 排序/分组开销)。剩余 RSS 主要由解析器 AST/临时对象贡献,留给 PR5(基准驱动)评估。

详见 docs/performance-security-analysis.md 中 PR2 复测结果与报告顺序说明小节。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions