网易首页 > 网易号 > 正文 申请入驻

OpenCode性能优化:7.45MB降到1.82MB

0
分享至

OpenCode 的实验性 PR #40427 集中处理 Electron renderer 的响应性。作者在固定快照上报告:初始入口从 7.45MB 降到 1.82MB;Home 最坏 Long Task 从 135ms 降到三次冷运行均为 0;Composer 最大输入更新时间从 151.79ms 收敛到 10.61ms。

这些数字对应提交 1b0e4e4610 PR 当前仍为 Open,最新 head 又补了路由和缓存语义修复,没有公开同口径复测。它是一组可研究的实验,不是稳定版结果公告。



优化目标是连续可交互

Home 三次冷运行的完整完成时间分别为 2356ms、2014ms、1923ms。列表全部出现仍需约两秒。作者接受这项取舍,因为页面会跨 lazy chunk、Worker 和 animation frame 分阶段完成,过程中没有 100ms 级 renderer 大块阻塞。

整套设计可以拆成四种预算:启动代码与数据工作集、主线程纯计算、单帧 DOM 提交、无明确消费者的后台任务。



一、启动工作集按功能访问边界拆分

packages/app/src/app.tsx 使用 Solid lazy() 拆出 Session、Home、legacy layout 与 File renderer;desktop i18n 只让英语字典常驻,其余 locale 动态加载;titlebar 和 overlay 也有独立 Suspense。

const Session = lazy(() => import("@/pages/session-lazy"))
const Home = lazy(() => import("@/pages/home"))
const File = lazy(() =>
import("@opencode-ai/session-ui/file")
.then((m) => ({ default: m.File })),
)

入口体积因此沿 7.45 → 5.80 → 3.95 → 2.64 → 1.82MB 下降。首次访问懒模块仍需支付加载与求值成本,所以合理边界应对应真实功能路径,明确导航时再定向 warm。

二、Worker 既要转移输入,也要限制输出

兼容 SDK 的 Session 消息、兼容 VCS diff,以及 Home V2 session list,以 ArrayBuffer 获取响应,再将 buffer 作为 transferable 交给懒 Worker。

getWorker().postMessage({ id, type, buffer }, [buffer])

Worker 内执行 TextDecoder → JSON.parse → clean/sort/project。Home 数据还会按目录过滤、保留近期记录并限制为 64 条。

普通对象返回 renderer 时仍需 structured clone。若把巨型对象原样送回,内存分配、Solid store 写入和 DOM reconciliation 仍会阻塞。有效的边界由三部分组成:transfer 原始输入,在线程内完成纯计算并裁剪,只返回有界结构。

当前新 V2 messageApi 的 Session 路径仍在主线程 normalize,因此不能把这项优化外推到所有消息链路。



三、DOM 按 frame 分批提交

Home 最多保留 64 条 session,第一帧只挂 4 行,此后每个 requestAnimationframe 再增加 4 行。

const HOMESESSIONLIMIT = 64
const HOMESESSIONRENDERBATCH = 4

requestAnimationFrame(() => {
setVisible((n) => Math.min(n + HOMESESSIONRENDERBATCH, count))
})

完成态 Markdown 每批主动执行约 8ms,剩余 block 放到下一帧。renderGeneration 相当于取消令牌:新内容产生后,旧批次的下一帧会退出,避免过期 DOM 工作持续占用 CPU。

8ms 只是批次检查点。单个巨型 block 仍可能超预算;120Hz 屏幕的整帧也只有约 8.3ms。实现提供了抢占和取消位置,没有提供硬实时保证。

四、后台推测服从显式需求

项目元数据与 Home index 保持 eager。provider catalog、global config/path、active-session status 等任务先避开首屏,再由 timer 与 idle callback 兜底。Composer 或模型设置一旦显式调用 loadProviders(),会立即打开数据 gate。

Session history page 从 200 条降到 50 条,ingestion 前先 scheduler.yield();邻居 Session 不再自动预取,只有明确导航时 warm,且 chunk、并发、pending 和缓存全部有界。

yield() 只改变执行顺序,不会降低总 CPU。把批量从 200 缩到 50,才让 continuation 本身变小。



五、输入和 diff 优先收敛最坏尾部

Composer 的 p50 从 6.50ms 到 6.17ms,几乎持平;最大更新时间从 151.79ms 降到 10.61ms。测量修订把 Prompt 结构的解析结果集中计算并复用,重点解决复杂 contenteditable 状态下的异常峰值。

当前 head 已重组输入代码:parseFromDOM() 只构建一次 Prompt 并复用,getCursorPosition() 仍会 clone Range 并递归计算长度。当前实现不能表述为全程一次 DOM 遍历。

VCS diff 列表也不再提前携带所有完整 patch。列表只取摘要,选中文件后才加载完整或有界 diff。兼容 diff Worker 的结果若撞上连续输入,会等待最近一次 beforeinput 后 100ms 再 resolve,避免响应式更新挤进键击窗口。

性能数据如何获得

Profiler 运行 production Electron,使用固定 24 小时真实语料。17.31GiB 只读源数据库被裁为 25.2MiB partial snapshot,并记录 SHA-256;每轮复制独立工作数据库,再冷重启 Electron。

Long Task、LoAF、CPU profile 和 frame gap 被同时采集。三次 Home 测试还插入 80ms 人工校准任务,三次均被观察器捕获,排除了“0 Long Task 是监控失效”的简单解释。

剩余问题也写在报告里:一次 Home run 仍有 152ms LoAF blocking;大 Session 仍有 67–121ms Long Task;真实私有快照无法由第三方完整还原;当前 head 没有同口径复测。



总结

OpenCode 这组改动的共同语言是“有界、可中断、按需求发生”:启动只带当前路径需要的代码;跨线程处理时在线程内先裁剪;DOM 按帧批量提交并允许取消;后台数据服从显式用户意图。

迁移这些做法时,要继续追问成本被移到了哪里、Worker 返回对象是否有界、主线程恢复后是否仍有大批提交、性能数字属于哪个 revision。做到这一步,lazy、Worker、rAF 和 idle 才能组成性能架构。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
全面符合预期!美国7月CPI同比涨幅收窄至3.4%,核心CPI同比放缓至2.5%

全面符合预期!美国7月CPI同比涨幅收窄至3.4%,核心CPI同比放缓至2.5%

华尔街见闻官方
2026-08-12 20:50:54
失业仅21天,一户八口灭门的副总裁,不是残忍,而是美国中产清醒

失业仅21天,一户八口灭门的副总裁,不是残忍,而是美国中产清醒

云景侃记
2026-08-09 09:51:57
终于熬出头!57岁萨日娜传出好消息,曾被嫌弃长相的她扬眉吐气了

终于熬出头!57岁萨日娜传出好消息,曾被嫌弃长相的她扬眉吐气了

冷紫葉
2026-08-12 14:17:35
取消特权,全民赞成!退休金设计者郑秉文,55年出生,他会怎样?

取消特权,全民赞成!退休金设计者郑秉文,55年出生,他会怎样?

娱乐的硬糖吖
2026-07-29 16:44:46
深圳女房东很崩溃!租客开豪华螺蛳粉餐厅倒闭要退租,本想躺着收租过日子,不想打工啊

深圳女房东很崩溃!租客开豪华螺蛳粉餐厅倒闭要退租,本想躺着收租过日子,不想打工啊

捣蛋窝
2026-08-12 10:31:14
反转!其母证实雅典娜没死,潮汕商会曝猛料,网友:这比死还难受

反转!其母证实雅典娜没死,潮汕商会曝猛料,网友:这比死还难受

喜欢历史的阿繁
2026-08-13 01:54:44
上海“婚外胚胎案”妻子称遭到短信轰炸,回应“奢侈美容”“给狗过天价生日”等传言:荒诞至极

上海“婚外胚胎案”妻子称遭到短信轰炸,回应“奢侈美容”“给狗过天价生日”等传言:荒诞至极

极目新闻
2026-08-12 08:57:34
王曼昱横扫晋级,竟惨遭嘲讽!球迷怒了!

王曼昱横扫晋级,竟惨遭嘲讽!球迷怒了!

乒乓乐园
2026-08-13 07:05:34
没有演技别硬演老人!看沈腾《欢迎来龙餐馆》,才知何为判若两人

没有演技别硬演老人!看沈腾《欢迎来龙餐馆》,才知何为判若两人

剧芒芒
2026-08-10 19:51:02
这就是公开辱华的后果!取消冠军头衔只是开始,职业生涯也全毁了

这就是公开辱华的后果!取消冠军头衔只是开始,职业生涯也全毁了

阿凫爱吐槽
2025-12-17 17:24:39
杰青院长一纸辞职信仅两行字:不想干了,特提出辞职

杰青院长一纸辞职信仅两行字:不想干了,特提出辞职

生物学霸
2026-08-12 17:42:45
观察一下身边的人,你就会发现:凡是看起来精明、计较、强势的人,往往在长远利益上吃亏,而厚道和善的人会更容易赢得人心

观察一下身边的人,你就会发现:凡是看起来精明、计较、强势的人,往往在长远利益上吃亏,而厚道和善的人会更容易赢得人心

德鲁克博雅管理
2026-08-11 17:23:50
李一桐粉色裙造型爆火:极致身材的背后,是普通人做不到的自律

李一桐粉色裙造型爆火:极致身材的背后,是普通人做不到的自律

传递满满正能量
2026-08-13 06:30:02
女篮重建引发巨大争议!6人未达国手水准,宫鲁鸣取舍惹热议

女篮重建引发巨大争议!6人未达国手水准,宫鲁鸣取舍惹热议

刘哥谈体育
2026-08-13 00:09:36
CBA猛料!杜锋躲过篮协调查,广东心仪外援加盟广州,北控签约NBA后卫

CBA猛料!杜锋躲过篮协调查,广东心仪外援加盟广州,北控签约NBA后卫

中国篮坛快讯
2026-08-12 17:24:48
一天内两名人离世,最大97岁,无儿无女成遗憾

一天内两名人离世,最大97岁,无儿无女成遗憾

眼底星碎
2026-08-12 14:42:37
《异星觉醒》流媒体翻红:丽贝卡·弗格森8年前的科幻恐怖片为何重回热榜?

《异星觉醒》流媒体翻红:丽贝卡·弗格森8年前的科幻恐怖片为何重回热榜?

自愈小日子
2026-08-13 01:34:35
瑜伽馆也没有瑜伽了…

瑜伽馆也没有瑜伽了…

微微热评
2026-08-11 18:04:35
乌克兰捅破天了!俄乌战局,最惨烈时刻到了!

乌克兰捅破天了!俄乌战局,最惨烈时刻到了!

大嘴说天下
2026-08-11 18:48:51
房地产,突然暴涨!发生了什么?

房地产,突然暴涨!发生了什么?

中国基金报
2026-08-12 16:02:52
2026-08-13 08:00:49
侃故事的阿庆
侃故事的阿庆
几分钟看完一部影视剧,诙谐幽默的娓娓道来
754文章数 9191关注度
往期回顾 全部

科技要闻

DeepSeek V4 Pro正式版深夜"突袭"

头条要闻

男子遭"炸街"折磨刺死19岁小伙获死刑 被害人父亲发声

头条要闻

男子遭"炸街"折磨刺死19岁小伙获死刑 被害人父亲发声

体育要闻

杜兰特,所谓的“联盟小王”

娱乐要闻

老戏骨杨昆两夺金鹰奖,因物业费被告

财经要闻

华尔街把AI算力炒成下一个房地产?

汽车要闻

全系600km续航/空间表现出色 奇瑞风云T7预售10.99万起

态度原创

本地
手机
旅游
艺术
健康

本地新闻

黄州一夜,苏轼写给普通人的月光

手机要闻

荣耀Robot Phone首发搭载驭光H1!荣耀自研影像芯片

旅游要闻

留好你的高铁车票,暑期游玩隐藏福利都靠它!

艺术要闻

赏心悦目的色调,看了非常治愈!

身子歪≠脊柱侧弯,侧弯发病率没变

无障碍浏览 进入关怀版