•
ChatGPT 长会话卡顿的修复:ChatGPT Performance Fix 使用说明
由 canxin 创作 • 阅读需要 8 分钟 •
目录
ChatGPT 的长会话在消息数量增加、工具调用变多,或回复里包含大量代码块时,常见现象是打开变慢、向上滚动卡顿,甚至页面短时间失去响应。
ChatGPT Performance Fix 是一个 Tampermonkey 用户脚本,针对这类长会话的加载和渲染过程做了优化。核心思路不是修改服务器上的会话内容,而是减少浏览器一次性接收、解析和渲染的数据量。
安装
- 安装 Tampermonkey。
- 打开一键安装 ChatGPT Performance Fix。
- 在 Tampermonkey 的安装页面确认脚本。
- 刷新 ChatGPT,脚本即可生效。
使用方式
安装完成后,日常使用方式不变。打开长会话时,默认只渲染最近 2 轮对话;需要查看更早内容时,页面顶部会出现历史控制条。
历史控制条支持以下操作:
- 选择每次加载的历史数量:
1 / 2 / 5 / 10 / 20 / 50轮。 - 选择“自定义”填写加载数量。
- 点击“加载 N 轮”手动读取更早消息。
- 点击“全部加载”恢复完整历史加载方式。
Tampermonkey 菜单还提供几个设置项:
- 默认打开:N 轮 / 全部:设置打开会话时的初始历史数量。
- 历史批量:N 轮 / 全部:设置手动加载历史时的默认批量。
- 切换模式:支持
balanced、aggressive和off。 - 隐藏/显示消息时间与模型:切换消息下方的元信息徽标。
默认使用 balanced 模式。页面卡顿仍然明显时,可以切换到 aggressive;需要恢复 ChatGPT 原始行为时,可以切换到 off。
适合什么场景
这个脚本主要适合以下情况:
- 单个会话持续使用很久,历史消息数量较多。
- 会话包含大量工具调用、代码执行结果或内部结构消息。
- 回复中包含很多代码块、表格或复杂 Markdown。
- 打开会话时页面长时间空白,向上滚动时出现明显停顿。
- 浏览器标签页的 CPU 占用和内存占用持续偏高。
普通短会话的数据量较小,优化前后的差异通常不明显。
原来的卡顿来自哪里
ChatGPT 原本可能在打开会话时请求一整棵历史消息树。一次旧版响应包含约 11 MB JSON 和 5,405 个 mapping 节点,其中还包括大量工具调用、工具返回、隐藏消息和未使用的历史分支。
这些内容返回浏览器后,还需要经过 JSON 解析、会话树构建、React 组件提交、Markdown 渲染、代码块初始化和浏览器布局。消息区与侧边栏共享同一个主线程,任意一处长时间执行都会让整个页面一起卡住。
向上滚动加载历史时,旧流程还会把整页消息一次性插入 DOM,并立即读取新的 scrollHeight 来修正滚动位置。这会强制浏览器同步完成 React 提交、样式计算和布局,历史页越大,停顿越明显。
另外,流式 Markdown 和代码块原本会通过高频动画逐步更新内容,大量代码块还会分别创建尺寸观察器和代码编辑器实例。几十个重型富文本节点同时恢复时,布局和绘制压力会集中出现。
修复方式
首次打开改为按需分页
脚本会优先使用 ChatGPT 自己的分页接口,以最近 2 轮作为初始窗口,并保留服务器返回的历史 cursor。更早的消息不会在打开时全部渲染,只有点击历史控制条后才继续加载。
这样可以把“打开会话”从一次全量处理,改成“先显示最近内容,再按需读取历史”。分页过程仍然使用 ChatGPT 原有的数据结构,不会改变服务器上的会话。
兼容旧版全量接口
部分页面或特殊会话仍可能走旧版全量接口。遇到这种情况,脚本会在数据交给页面之前压缩浏览器副本:
- 沿当前活动分支保留有效消息。
- 历史回合主要保留用户消息和最终回复。
- 删除不需要显示的旧工具调用、工具结果和隐藏节点。
- 保留当前节点及必要的父节点,避免影响会话继续生成。
服务器原始数据不会被删除,压缩只发生在当前页面的内存数据上。
把重数据处理移出主线程
JSON 解析、分页响应合并和历史消息优化放在 Web Worker 中执行。页面主线程只负责接收整理后的结果,减少大段数据解析时对滚动和输入操作的阻塞。
已完成且空闲的会话响应还会保存在当前页面的内存快照中。后续相同读取优先使用快照,不额外进行后台轮询;正在生成或状态不明确的会话不会被长期缓存。
降低富文本和代码块的集中渲染压力
脚本针对 ChatGPT 的重型富文本组件做了几层处理:
- 跳过高频的逐字符 Markdown 平滑渲染。
- 取消代码块从零高度展开的动画,避免先出现大量空白横条。
- 跳过特定平滑代码块的重复
ResizeObserver测量。 - 对代码块、表格、KaTeX 和预览区域分级预热,靠近视口的内容优先恢复。
- CodeMirror 代码编辑器只在接近可视区域时初始化,避免打开页面时一次创建几十个编辑器实例。
这些处理减少的是布局、测量和绘制峰值,普通文本和已经位于视口中的内容仍然保持正常显示。
项目地址
脚本默认使用 balanced 模式,适合大多数长会话。ChatGPT 页面结构变化后,脚本可能需要同步更新;遇到兼容性问题时,可以先切换到 off 模式恢复原始行为。
评论