dsh-perf-boost 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +43 -0
- package/LICENSE +21 -0
- package/README.md +77 -2
- package/assets/icon-180.png +0 -0
- package/assets/icon.svg +19 -0
- package/cordis.patch.yml +3 -0
- package/lib/client.js +1078 -0
- package/lib/host/warmup.js +146 -0
- package/lib/index.js +193 -0
- package/package.json +55 -5
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# CHANGELOG
|
|
2
|
+
|
|
3
|
+
尚未发布到 npm;版本号先固定在 0.1.0,等上架时再统一打号。
|
|
4
|
+
|
|
5
|
+
## 当前能力(0.1.0)
|
|
6
|
+
|
|
7
|
+
- 长对话省渲染:消息列表里屏幕外的条目跳过布局与绘制,预留高度按实测值给。
|
|
8
|
+
- 窗口隐藏不排帧:窗口不可见时不往合成器送帧,切回前台自动恢复。
|
|
9
|
+
- 空闲降帧:20 秒无输入把 JS 驱动的动画降到 30fps,CSS 动画不受影响。
|
|
10
|
+
- 媒体懒加载:图片、视频、iframe 推迟到需要时再解码。
|
|
11
|
+
- 后台暂停定时器:窗口不可见时 `setInterval` 回调全部跳过(不销毁、不重置周期),回前台每个补跳一次。
|
|
12
|
+
- 视口外暂停视频:静音视频滚出视口暂停解码,滚回续播;有声音的不动。
|
|
13
|
+
- 扫描不抢帧:首屏与流式输出期间把扫描推到 `requestIdleCallback`,流式里最多推迟 6 次(约 9 秒)。
|
|
14
|
+
- 会话列表节流:流式输出时列表常因「只有 token 计数变了」整树重渲染,这里把这类只改身份的发布攒到每秒一次;可见字段(当前会话、标题、条数、顺序)真变了立刻放行。
|
|
15
|
+
- 大会话预热:启动 15 秒后,把最近用过的 10 个 8MB 以上会话文件分段读进系统文件缓存(4MB 一块、每块歇 40ms、总量上限 400MB、最长 3 分钟),点进去时少等硬盘;只读,不碰会话数据。
|
|
16
|
+
- 可感知的三项默认关:关背景模糊、减少动画、帧率角标。
|
|
17
|
+
|
|
18
|
+
## 已知边界
|
|
19
|
+
|
|
20
|
+
- 会话列表的虚拟滚动属于 `@deepseek-ai/dsh-client-ui-conversation` 上游,插件改不了。
|
|
21
|
+
- 主窗口透明/毛玻璃参数在 `app.asar` 的 main 进程,且只在 macOS 分支生效。
|
|
22
|
+
- 会话投影(打开会话时的 fork/折叠)由宿主内部实现,没有公开的预热接口;硬塞会在签名变化时把宿主弄崩,所以只做文件缓存预热,不做投影预热。
|
|
23
|
+
|
|
24
|
+
## 开发记录
|
|
25
|
+
|
|
26
|
+
- 指标从估算改为实测:rAF 回调、被接管的 `setInterval` 回调、会话列表 `store.set` 发布逐次计时;`≈X%` 只由真实计时得出,样本不足 120ms 显示「—」。自检句柄 `window.__dpbMet`、`window.__dpbMetSnapshot()`。
|
|
27
|
+
- 设置页不再每秒重渲染:快照没变就不渲染、最长 5 秒看一眼、页面在后台跳过;`window.__dpbPanelRenders` 供自检。
|
|
28
|
+
- 上次结果跨启动保留:页面端口每次启动不同,`localStorage` 会失效,所以在宿主侧加 `POST /api/dsh-perf-boost/last-run` 读写 `~/.dsh/perf-boost-last.json`;写盘最多一分钟一次。
|
|
29
|
+
- 卡片只保留大号百分比与一行标题。
|
|
30
|
+
- 审计修复:
|
|
31
|
+
- `≈X%` 不再把「推迟」当「省下」:隐藏期压住的 rAF 回调回前台会补跑,毫秒照样要花;只算真正不再发生的(隐藏期跳过的定时器回调、合并掉的列表发布)。
|
|
32
|
+
- 隐藏期 rAF 队列加上限 200,避免最小化久了攒出大量闭包、回前台一次性跑完卡死。
|
|
33
|
+
- 「媒体懒加载」「视口外暂停视频」关掉时真的还原(`clearMedia()` / `clearViewportMedia()`)。
|
|
34
|
+
- `requestAnimationFrame` 的 id 从 1e9 起,避免与接管前发出的原生 id 撞号。
|
|
35
|
+
- 两个 rAF 开关都关掉时还原原生 `requestAnimationFrame`。
|
|
36
|
+
- 设置页写盘从渲染函数挪进 effect 定时器。
|
|
37
|
+
- 「检查更新」加 9 秒超时。
|
|
38
|
+
- `sessions` 服务晚注册时重试最多 10 次。
|
|
39
|
+
- `store.set` 保留返回值。
|
|
40
|
+
- 长会话里清掉已脱离文档的子项引用。
|
|
41
|
+
- 宿主预热跳过 10 分钟内还在写的会话文件。
|
|
42
|
+
- CI 补跑 `scripts/smoke-client.mjs`;`dsh.client.inject` 与代码实际注入(`slots`/`sessions`)对齐。
|
|
43
|
+
- 文档与索引去掉「帧率上限 / p50/p95 帧时 / 诊断卡片」这些已删功能。
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 AlL
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,78 @@
|
|
|
1
|
-
#
|
|
1
|
+
# dsh-perf-boost
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
DeepSeek Harness 桌面端的客户端渲染优化插件,全部改动只发生在渲染进程。
|
|
4
|
+
|
|
5
|
+
Client-side rendering optimizations for DSH Desktop.
|
|
6
|
+
|
|
7
|
+
设置入口:**设置 → 性能优化**
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
## 开关
|
|
11
|
+
|
|
12
|
+
按默认状态排序,前六项默认开启,对观感没有可见影响。
|
|
13
|
+
|
|
14
|
+
| 开关 | 默认 | 影响视觉 | 作用 |
|
|
15
|
+
| --- | --- | --- | --- |
|
|
16
|
+
| 长对话省渲染 | 开 | 无 | 列表子项加 `content-visibility: auto`,占位高度取该列表实测平均子项高度;末尾 4 项与正在流式输出的消息不处理,超过 300px 的代码块同样跳过 |
|
|
17
|
+
| 窗口隐藏不排帧 | 开 | 无 | 页面不可见时 `schedule()` 直接返回;切回时有 `visibilitychange` 钩子恢复,每秒看门狗兜底 |
|
|
18
|
+
| 空闲降帧 | 开 | 无 | 20 秒无输入将 rAF 驱动的动画降到 30fps,有输入立即恢复 |
|
|
19
|
+
| 媒体懒加载 | 开 | 无 | 图片加 `loading=lazy`、`decoding=async`,视频加 `preload=metadata` |
|
|
20
|
+
| 后台暂停定时器 | 开 | 无 | 页面不可见时跳过 `setInterval` 回调,不销毁也不重置周期;回到前台各补跳一次 |
|
|
21
|
+
| 视口外暂停视频 | 开 | 无 | 仅处理静音视频:滚出视口暂停解码,滚回续播 |
|
|
22
|
+
| 关闭背景模糊 | 关 | 有 | 全局 `backdrop-filter: none`,浮层由磨砂改为纯色底 |
|
|
23
|
+
| 减少动画 | 关 | 有 | 动画与过渡时长置 0.001ms,弹窗不再逐帧动 |
|
|
24
|
+
| 帧率角标 | 关 | 有 | 右下角显示 `NN fps` |
|
|
25
|
+
|
|
26
|
+
不提供预设档位。
|
|
27
|
+
|
|
28
|
+
## 验证
|
|
29
|
+
|
|
30
|
+
- 「长对话省渲染」行下方显示 `已生效:N 个列表,跳过 M 项渲染(共 K 项)`
|
|
31
|
+
- 打开「帧率角标」,右下角出现 fps 小方块
|
|
32
|
+
- 控制台 `window.__dpbRaf`、`window.__dpbTimers` 为 `true`,表示 rAF 与定时器接管成功
|
|
33
|
+
|
|
34
|
+
角标读数为浏览器实际送帧数,上限等于显示器刷新率。帧时、DOM 节点等细分数据请用 DevTools 的 Performance 面板录制,插件不做常驻采样。
|
|
35
|
+
|
|
36
|
+
## 实测
|
|
37
|
+
|
|
38
|
+
Windows 桌面端,200Hz 显示器,缩放 100%:
|
|
39
|
+
|
|
40
|
+
| 场景 | 帧率 | p50 帧时(DevTools) |
|
|
41
|
+
| --- | --- | --- |
|
|
42
|
+
| 空白页(同机 Edge) | 187–200 | 5.0 ms |
|
|
43
|
+
| DSH 页面(新会话,DOM 1218) | 200 | 5.0 ms |
|
|
44
|
+
| DSH 桌面端(2.3 万事件会话) | 约 156 | ≈6.4 ms |
|
|
45
|
+
|
|
46
|
+
页面代码本身可以跑满刷新率,差距来自长会话的 DOM 体量与 Electron 窗口合成。
|
|
47
|
+
|
|
48
|
+
## 安装
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
pnpm add dsh-perf-boost
|
|
52
|
+
pnpm add github:AlLHHH/dsh-perf-boost
|
|
53
|
+
pnpm add file:./dsh-perf-boost
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
将 `dsh-perf-boost` 加入 profile 的 `dsh.profile.bundles`,重启应用生效;卸载时从 bundles 移除并重启。
|
|
57
|
+
|
|
58
|
+
## 实现说明
|
|
59
|
+
|
|
60
|
+
- 只修改当前渲染进程:不改宿主代码,不落盘配置,不发送遥测。配置存于 `localStorage['dsh-perf-boost:cfg']`。
|
|
61
|
+
- 唯一的网络请求是「检查更新」:页面 POST 到 `/api/dsh-perf-boost/update-check`,由宿主查询 npm 的 latest(CSP 限制页面不能直接跨域)。查询失败显示「未查到」,不影响功能。
|
|
62
|
+
- `requestAnimationFrame` 仅在启用「窗口隐藏不排帧」或「空闲降帧」时接管,否则保持原生实现。
|
|
63
|
+
|
|
64
|
+
## 已知限制
|
|
65
|
+
|
|
66
|
+
- 窗口的 `transparent` / `vibrancy` 由应用自身(`app.asar` 的 `lib/main.js`)决定,Windows 分支不透明,插件无法修改。
|
|
67
|
+
- 省渲染只减少布局与绘制,消息节点仍在内存中,超长会话的滚动开销依然存在。
|
|
68
|
+
- 媒体懒加载只修改属性,不改动 DOM 结构,已加载的图片不会被回收。
|
|
69
|
+
|
|
70
|
+
## 兼容
|
|
71
|
+
|
|
72
|
+
- `engines.dsh >= 0.2.0-0`,实测 0.2.1-rc.2(桌面版 0.2.1.0)
|
|
73
|
+
- peer `@deepseek-ai/cordis ^4.0.1`,实测 4.0.5
|
|
74
|
+
- 依赖客户端插件 API:`window.__ModuleLoader__.load`、`slots`(`settings.section`)、`require('react')`
|
|
75
|
+
|
|
76
|
+
## 许可
|
|
77
|
+
|
|
78
|
+
MIT
|
|
Binary file
|
package/assets/icon.svg
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" viewBox="0 0 256 256">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
|
|
4
|
+
<stop offset="0" stop-color="#1b1f2e"/>
|
|
5
|
+
<stop offset="1" stop-color="#0d1018"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<linearGradient id="accent" x1="0" y1="0" x2="1" y2="0">
|
|
8
|
+
<stop offset="0" stop-color="#4d6bfe"/>
|
|
9
|
+
<stop offset="1" stop-color="#4fd1c5"/>
|
|
10
|
+
</linearGradient>
|
|
11
|
+
</defs>
|
|
12
|
+
<rect width="256" height="256" rx="56" fill="url(#bg)"/>
|
|
13
|
+
<path d="M52 168a76 76 0 0 1 152 0" fill="none" stroke="#2a3350" stroke-width="16" stroke-linecap="round"/>
|
|
14
|
+
<path d="M52 168a76 76 0 0 1 70-75.8" fill="none" stroke="url(#accent)" stroke-width="16" stroke-linecap="round"/>
|
|
15
|
+
<path d="M128 92v-14" stroke="#4fd1c5" stroke-width="14" stroke-linecap="round"/>
|
|
16
|
+
<path d="M128 168 168 126" stroke="#e8ecff" stroke-width="14" stroke-linecap="round"/>
|
|
17
|
+
<circle cx="128" cy="168" r="13" fill="#4d6bfe"/>
|
|
18
|
+
<path d="M96 196h64" stroke="#2a3350" stroke-width="12" stroke-linecap="round"/>
|
|
19
|
+
</svg>
|
package/cordis.patch.yml
ADDED