performance标签页可记录vs code主线程阻塞点,重点观察extension activation长条、render blocking红色尖刺及extensionhost进程js堆栈占用;录制需单一操作、排除干扰,右键长任务可缩放聚焦调用栈。

Developer: Toggle Developer Tools 能看到什么
打开这个工具后,Performance 标签页不是“看看就完事”的装饰面板——它直接记录了 VS Code 启动和操作过程中的主线程阻塞点。你真正该盯的是 Extension Activation 区域的长条、Render Blocking 的红色尖刺,以及 extensionHost 进程在 JS 堆栈里持续占用的时间段。
常见错误现象:点了“录制”再打开一个 .ts 文件,结果火焰图里 80% 是 tsserver.js 的 parse 操作,或者某扩展的 activate 函数卡住主线程超 600ms;这说明语言服务或扩展初始化逻辑本身就有瓶颈,不是“等一会儿就好”的问题。
实操建议:
- 录制前先清空所有编辑器标签,关闭终端和调试控制台,避免干扰信号
- 只做单一动作(比如仅打开一个文件),否则火焰图会混杂多个行为的耗时
- 右键火焰图中任意长任务 → “Zoom to Selected”,聚焦看它调用了哪些函数、是否在反复读取
node_modules或解析大 JSON
Developer: Show Running Extensions 判断谁在抢主线程
这个命令不显示“已安装”,只显示“此刻正在干啥”。Startup Time > 150ms 的扩展基本可以列为嫌疑对象;CPU 列持续跳动、Memory > 200MB 的,大概率在后台轮询或缓存全量 Git 历史。
使用场景:你敲代码时偶尔卡顿 1–2 秒,但没明显触发动作——这时候看 Show Running Extensions,往往发现 GitLens 正在刷新 git blame 缓存,或 ESLint 在遍历整个 src/ 目录做 on-type 验证。
实操建议:
- 状态为
Running且 CPU 数值实时变化的,才是真正在干活;Activated但数值静止的,可能只是挂了个监听器没触发 - 重点关注
activationTime字段(在详情里点小箭头展开),VS Code 1.85+ 会标出是否因onStartup触发,这类扩展一开就占资源 - 别急着禁用,先查它文档里有没有
xxx.enabled或xxx.maxFiles这类轻量化开关
code --disable-extensions 是最干净的验证手段
这不是“试试看”,而是隔离变量的硬性验证。只要卡顿消失,就能 100% 锁定是扩展导致——哪怕你刚禁用了 20 个,也比猜哪个配置写错了高效得多。
参数差异:code --disable-extensions 完全绕过 extensionHost 进程,连 package.json 里的 activationEvents 都不加载;而“以安全模式运行”菜单项有时仍会加载部分内置扩展,不可靠。
实操建议:
- 必须关掉所有 VS Code 窗口后再执行命令,否则旧进程残留会影响判断
- macOS 用户注意:
code --status在稳定版可能不输出完整扩展耗时,优先用code-insiders --status辅助定位启动慢的扩展 - 如果禁用后仍卡顿,立刻转向检查
files.watcherExclude和search.exclude是否漏配了**/logs/**或**/.next/**
Performance 面板里容易被忽略的渲染陷阱
很多卡顿其实和扩展无关,而是 Electron 渲染层自己卡住了。比如你在滚动长 Markdown 文档时掉帧,Performance 面板里 Layout 或 Paint 阶段出现密集黄条,说明是 CSS 重排或字体回退导致的 GPU 渲染压力。
性能影响:这类问题在 macOS 上更明显,尤其开启 editor.smoothScrolling 或用了带动画的主题时,主线程要反复计算滚动位置并合成图层。
实操建议:
- 在 DevTools 的
Rendering标签页(需右键菜单勾选)开启 Paint flashing,快速识别频繁重绘区域 - 临时关闭硬件加速:
code --disable-gpu启动对比,若流畅度提升,说明显卡驱动或窗口管理器有兼容问题 -
Window: Enable Native Tabs在 macOS 上建议关掉,原生标签栏会干扰 Chromium 的渲染管线调度
Extension Activation 和 Render Blocking 的交界处——比如某个扩展激活后注册了文件监听,而监听器又触发了 UI 重绘,两件事挤在同一帧里,人眼就感知为“卡了一下”。这种链式反应,只看单个指标会漏判。











