Replies: 2 comments
|
这条热点( 要点:热点之所以被放大 8 倍,是因为 你 profile 里的量级(10.66MB / |
|
补充一份 Windows 侧的独立测量(原帖给的是 profile 自身耗时,这里给改掉它之后启动实际快多少的端到端数字),另附一个"上游至今未修"的核对。 环境:Windows 11,Node v24.15.0, 1) 只改
|
启动到打印 dsh web: <url> |
单次 compose | |
|---|---|---|
| 现状 | 8.02s / 8.31s | 500–630ms |
仅把 for (const char of value) 换成 indexOf 循环 |
5.67s / 5.67s | 267–345ms |
→ 端到端 −2.5s,与你「1.24s → 数十 ms」的预估同向、幅度更大。原因是这个函数每轮被调用多次(批次 combo 一遍 + 每个包的单包 combo 一遍 + identitySectionMap 内再扫一遍),单轮累计扫描约 44MB(每个字节约被扫 3.8 遍),再乘上 #6391 说的重组合次数。
2) 该处在 0.1.6-alpha.1 仍未修(npm pack 取包逐字比对,未安装到本机)
0.1.5-rc.2与0.1.6-alpha.1的@deepseek-ai/dsh-client-modules/lib/index.js:newlineCount与现装 0.1.5-rc.1 逐字相同(同为逐字符for...of)。@deepseek-ai/dsh-client-ui-sidebar-documentpreview的lib/client.js:0.1.5-rc.16.57MB、0.1.6-alpha.16.58MB,首行仍是//! Bundled PDF.js license notices(pdfjs-dist6.3.289 整体内联)。
即:原帖建议的 1 与 3 两条,在最新的 alpha 上都还没有落地。
3) 测量手段(可复现,供维护者取用)
- CPU profile 的落盘坑:Node 只在正常退出时写
.cpuprofile,而隔离实例通常是被taskkill /F收掉的,采到的会丢——我加了一个EXIT_AFTER_MS预加载让它在采样窗口后自行退出。 - 计数与验证都在加载期做,不改磁盘:用 Node ≥22.15 的
module.registerHooks在加载dsh-client-modules/lib/index.js时改写源码——一个钩子把compose()拆成"计时包装 + 原实现",另一个钩子把newlineCount换成indexOf实现,于是"跑了几次、每次多久、改完省多少"都是实测而非推算。
Uh oh!
There was an error while loading. Please reload this page.
Summary
dsh web启动到打印带 token 的 URL 需 6-7 秒。经 CPU profile 定位,约一半 CPU 时间消耗在@deepseek-ai/dsh-client-modules的启动期 client bundle 组装上:该模块在 JS 层对全部 client 半源码(本机实测约 14.9 MB)逐字符扫描并构建 sourcemap 段映射,且没有磁盘缓存,所以每次进程启动都要完整重算。Reproduction
0.1.5-rc.1,profileweb装配插件(本机 176 个,其中第三方client.js合计 4.24 MB)dsh web --no-open,计时"启动 → 打印http://127.0.0.1:3080/?token=..."Current behavior
耗时:连续两次启动分别 6.6s / 6.1s(稳定复现,排除首次冷启动/缓存因素)。
CPU 分解(
/usr/bin/time -l):user + sys ≈ real→ 纯 CPU-bound,不是网络或磁盘等待。node --cpu-prof热点(按自身耗时聚合,已剔除 idle):buildCombo@deepseek-ai/dsh-client-modules/lib/index.js:277newlineCount:240utf8WritebufferidentitySectionMap:266sourceURL/sourceMappingURL正则按模块聚合:
@deepseek-ai/dsh-client-modules占实际 CPU 约 47%。需要处理的 client 代码体量:
client.js:20 个文件 / 4.24 MB(最大@xmanrui/dsh-im918 KB)dsh-client-ui-sidebar-documentpreview单个 6.7 MB(占总量 45%)可疑实现(
dsh-client-modules/lib/index.js:240):逐字符
for...of迭代 + 字符串比较:对约 15 MB 文本相当于千万级迭代,实测 1.24s。代码中只看到进程内缓存(loadCache/pkgMeta),未发现磁盘缓存。Expected behavior
期望启动耗时明显低于当前水平(例如 < 2s);至少重复启动时不必重新计算未变更的 bundle 组装结果。
优化建议(按预估收益排序,仅供参考):
newlineCount改用indexOf循环或等价高效写法(预计 1.24s → 数十 ms 量级)dsh-client-ui-sidebar-documentpreview(6.7 MB)考虑拆分或按需加载,减少默认扫描量Environment
0.1.5-rc.1(npmlatest)web,插件 176 个(含大量第三方 client 半)dsh web --no-open/usr/bin/time -l、node --cpu-prof、sampleAll reactions