Skip to content
Go back

使用 tsc --generateTrace 进行构建性能分析

Published:  at  06:09 PM

wsl2 中跑 Flowise 源码时,pnpm build 竟然会内存不足,第一次出现这个情况,于是就有个这个研究

最后发现占用大部分内存的是import { ChatMistralAI } from '@langchain/mistralai

一、前置条件与适用场景

前置条件:

适用场景:


二、生成性能追踪文件

下执行以下命令:

npx tsc --generateTrace ./tsc-trace

说明:

可选命令:

NODE_OPTIONS="--max-old-space-size=8192" npx tsc --generateTrace ./tsc-trace
npx tsc --generateTrace ./tsc-trace --extendedDiagnostics

三、查看输出文件

生成目录 tsc-trace 下主要包含:

文件作用
trace.json核心性能追踪文件,包含所有事件数据,Chrome 火焰图可直接加载
types.json辅助文件,记录项目中所有类型的 ID 和名称,可结合 trace.json 分析泛型耗时或类型实例化情况

四、在 Chrome 中加载并分析火焰图

  1. 打开 Chrome 浏览器

  2. 在地址栏输入 chrome://tracing 回车

  3. 页面左上角点击 Load 按钮,选择 tsc-trace/trace.json 文件,或直接将文件拖拽进去

概述:


五、火焰图事件解读

火焰图中的事件大致可以分为顶层、主要阶段和详细事件。以下表格总结了常见核心事件及分析价值:

层级事件名称含义与作用分析价值 & 诊断线索
顶层program整个编译任务,从开始到结束宽度表示总构建时间,可作为性能基准
主要阶段createProgram准备阶段:查找源文件、读取配置、生成 AST宽度大可能说明文件多或磁盘 I/O 高
主要阶段check类型检查阶段:遍历代码、推断类型、检查错误宽度大表示类型复杂度高或泛型使用密集
主要阶段emit输出阶段:生成 .js, .d.ts, .js.map 文件宽度大可能说明 Source Map 或写入耗时
详细事件checkSourceFile单个源文件类型检查耗时可定位慢文件,矩形越宽耗时越长
详细事件instantiateType / instantiateSignature泛型实例化,计算最终类型泛型调用多、嵌套深会增加 check 阶段耗时
详细事件emitSourceFile单文件生成输出和 Source Map可定位单文件 emit 耗时
详细事件checkExpression表达式类型检查,如函数调用、对象字面量宽度大表示类型推断耗时高,可能优化泛型或类型定义

实用建议:

  1. 先看顶层 program 宽度,判断总构建时间

  2. check 阶段耗时长,可进一步分析 checkSourceFile,定位慢文件

  3. instantiateType / instantiateSignature 占比高,可考虑优化复杂泛型

  4. emit 阶段慢时,可关注 Source Map 或文件写入优化



Next Post
纯 JavaScript 节流和防抖函数