ChatGPT 长会话卡顿的修复:ChatGPT Performance Fix 使用说明

由 canxin 创作阅读需要 8 分钟


目录

ChatGPT 的长会话在消息数量增加、工具调用变多,或回复里包含大量代码块时,常见现象是打开变慢、向上滚动卡顿,甚至页面短时间失去响应。

ChatGPT Performance Fix 是一个 Tampermonkey 用户脚本,针对这类长会话的加载和渲染过程做了优化。核心思路不是修改服务器上的会话内容,而是减少浏览器一次性接收、解析和渲染的数据量。

安装

  1. 安装 Tampermonkey
  2. 打开一键安装 ChatGPT Performance Fix
  3. 在 Tampermonkey 的安装页面确认脚本。
  4. 刷新 ChatGPT,脚本即可生效。

使用方式

安装完成后,日常使用方式不变。打开长会话时,默认只渲染最近 2 轮对话;需要查看更早内容时,页面顶部会出现历史控制条。

历史控制条支持以下操作:

Tampermonkey 菜单还提供几个设置项:

默认使用 balanced 模式。页面卡顿仍然明显时,可以切换到 aggressive;需要恢复 ChatGPT 原始行为时,可以切换到 off

适合什么场景

这个脚本主要适合以下情况:

普通短会话的数据量较小,优化前后的差异通常不明显。

原来的卡顿来自哪里

ChatGPT 原本可能在打开会话时请求一整棵历史消息树。一次旧版响应包含约 11 MB JSON 和 5,405 个 mapping 节点,其中还包括大量工具调用、工具返回、隐藏消息和未使用的历史分支。

这些内容返回浏览器后,还需要经过 JSON 解析、会话树构建、React 组件提交、Markdown 渲染、代码块初始化和浏览器布局。消息区与侧边栏共享同一个主线程,任意一处长时间执行都会让整个页面一起卡住。

向上滚动加载历史时,旧流程还会把整页消息一次性插入 DOM,并立即读取新的 scrollHeight 来修正滚动位置。这会强制浏览器同步完成 React 提交、样式计算和布局,历史页越大,停顿越明显。

另外,流式 Markdown 和代码块原本会通过高频动画逐步更新内容,大量代码块还会分别创建尺寸观察器和代码编辑器实例。几十个重型富文本节点同时恢复时,布局和绘制压力会集中出现。

修复方式

首次打开改为按需分页

脚本会优先使用 ChatGPT 自己的分页接口,以最近 2 轮作为初始窗口,并保留服务器返回的历史 cursor。更早的消息不会在打开时全部渲染,只有点击历史控制条后才继续加载。

这样可以把“打开会话”从一次全量处理,改成“先显示最近内容,再按需读取历史”。分页过程仍然使用 ChatGPT 原有的数据结构,不会改变服务器上的会话。

兼容旧版全量接口

部分页面或特殊会话仍可能走旧版全量接口。遇到这种情况,脚本会在数据交给页面之前压缩浏览器副本:

服务器原始数据不会被删除,压缩只发生在当前页面的内存数据上。

把重数据处理移出主线程

JSON 解析、分页响应合并和历史消息优化放在 Web Worker 中执行。页面主线程只负责接收整理后的结果,减少大段数据解析时对滚动和输入操作的阻塞。

已完成且空闲的会话响应还会保存在当前页面的内存快照中。后续相同读取优先使用快照,不额外进行后台轮询;正在生成或状态不明确的会话不会被长期缓存。

降低富文本和代码块的集中渲染压力

脚本针对 ChatGPT 的重型富文本组件做了几层处理:

这些处理减少的是布局、测量和绘制峰值,普通文本和已经位于视口中的内容仍然保持正常显示。

项目地址

脚本默认使用 balanced 模式,适合大多数长会话。ChatGPT 页面结构变化后,脚本可能需要同步更新;遇到兼容性问题时,可以先切换到 off 模式恢复原始行为。

评论