ccjk 1.5.0 → 2.0.2
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/README.ja.md +249 -297
- package/README.ko.md +241 -290
- package/README.md +222 -364
- package/README.zh-CN.md +553 -295
- package/dist/chunks/claude-code-config-manager.mjs +7 -7
- package/dist/chunks/claude-code-incremental-manager.mjs +1 -1
- package/dist/chunks/codex-config-switch.mjs +3 -3
- package/dist/chunks/codex-provider-manager.mjs +1 -1
- package/dist/chunks/codex-uninstaller.mjs +2 -2
- package/dist/chunks/commands.mjs +1 -1
- package/dist/chunks/features.mjs +10 -10
- package/dist/chunks/simple-config.mjs +321 -389
- package/dist/chunks/smart-guide.mjs +234 -0
- package/dist/cli.mjs +1795 -433
- package/dist/i18n/locales/en/configuration.json +12 -1
- package/dist/i18n/locales/en/marketplace.json +84 -0
- package/dist/i18n/locales/en/menu.json +38 -1
- package/dist/i18n/locales/en/skills.json +140 -0
- package/dist/i18n/locales/en/smartGuide.json +49 -0
- package/dist/i18n/locales/en/subagent.json +69 -0
- package/dist/i18n/locales/en/superpowers.json +58 -0
- package/dist/i18n/locales/zh-CN/configuration.json +12 -1
- package/dist/i18n/locales/zh-CN/marketplace.json +84 -0
- package/dist/i18n/locales/zh-CN/menu.json +38 -1
- package/dist/i18n/locales/zh-CN/skills.json +140 -0
- package/dist/i18n/locales/zh-CN/smartGuide.json +49 -0
- package/dist/i18n/locales/zh-CN/subagent.json +69 -0
- package/dist/i18n/locales/zh-CN/superpowers.json +58 -0
- package/dist/index.d.mts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.mjs +366 -7
- package/package.json +26 -27
- package/templates/common/skills/en/brainstorming.md +64 -0
- package/templates/common/skills/en/code-review.md +81 -0
- package/templates/common/skills/en/documentation-gen.md +808 -0
- package/templates/common/skills/en/executing-plans.md +75 -0
- package/templates/common/skills/en/git-commit.md +216 -0
- package/templates/common/skills/en/interview.md +223 -0
- package/templates/common/skills/en/migration-assistant.md +312 -0
- package/templates/common/skills/en/performance-profiling.md +576 -0
- package/templates/common/skills/en/pr-review.md +341 -0
- package/templates/common/skills/en/refactoring.md +384 -0
- package/templates/common/skills/en/security-audit.md +462 -0
- package/templates/common/skills/en/systematic-debugging.md +82 -0
- package/templates/common/skills/en/tdd-workflow.md +93 -0
- package/templates/common/skills/en/verification.md +81 -0
- package/templates/common/skills/en/workflow.md +370 -0
- package/templates/common/skills/en/writing-plans.md +78 -0
- package/templates/common/skills/zh-CN/documentation-gen.md +807 -0
- package/templates/common/skills/zh-CN/migration-assistant.md +318 -0
- package/templates/common/skills/zh-CN/performance-profiling.md +746 -0
- package/templates/common/skills/zh-CN/pr-review.md +341 -0
- package/templates/common/skills/zh-CN/refactoring.md +384 -0
- package/templates/common/skills/zh-CN/security-audit.md +462 -0
- package/templates/common/smart-guide/en/smart-guide.md +72 -0
- package/templates/common/smart-guide/zh-CN/smart-guide.md +72 -0
|
@@ -0,0 +1,746 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: performance-profiling
|
|
3
|
+
description: 性能分析和优化建议
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
author: CCJK
|
|
6
|
+
category: dev
|
|
7
|
+
triggers:
|
|
8
|
+
- /perf
|
|
9
|
+
- /performance
|
|
10
|
+
- /profile
|
|
11
|
+
use_when:
|
|
12
|
+
- "用户需要性能分析"
|
|
13
|
+
- "代码运行缓慢"
|
|
14
|
+
- "需要优化性能"
|
|
15
|
+
- "用户提到性能分析"
|
|
16
|
+
auto_activate: false
|
|
17
|
+
priority: 6
|
|
18
|
+
difficulty: advanced
|
|
19
|
+
tags:
|
|
20
|
+
- performance
|
|
21
|
+
- optimization
|
|
22
|
+
- profiling
|
|
23
|
+
allowed-tools:
|
|
24
|
+
- Read
|
|
25
|
+
- Grep
|
|
26
|
+
- Glob
|
|
27
|
+
- Bash(node --prof *)
|
|
28
|
+
- Bash(npm run *)
|
|
29
|
+
- Bash(pnpm run *)
|
|
30
|
+
context: fork
|
|
31
|
+
user-invocable: true
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
# 性能分析技能
|
|
35
|
+
|
|
36
|
+
## 概述
|
|
37
|
+
|
|
38
|
+
此技能为您的代码库提供全面的性能分析和优化建议。它帮助识别瓶颈、内存问题,并提供可操作的优化策略。
|
|
39
|
+
|
|
40
|
+
## 性能分析检查清单
|
|
41
|
+
|
|
42
|
+
### 1. 算法复杂度分析
|
|
43
|
+
|
|
44
|
+
**大O符号审查:**
|
|
45
|
+
- 识别循环和嵌套循环(O(n)、O(n²)、O(n³))
|
|
46
|
+
- 检查递归函数的指数复杂度
|
|
47
|
+
- 审查排序和搜索算法
|
|
48
|
+
- 分析数据结构操作(数组、对象、Map、Set)
|
|
49
|
+
|
|
50
|
+
**危险信号:**
|
|
51
|
+
- 大数据集上的嵌套循环
|
|
52
|
+
- 没有记忆化的递归函数
|
|
53
|
+
- 热路径中的线性搜索
|
|
54
|
+
- 重复的数组操作(filter、map、reduce 链)
|
|
55
|
+
|
|
56
|
+
### 2. 内存使用模式
|
|
57
|
+
|
|
58
|
+
**内存分析:**
|
|
59
|
+
- 检查内存泄漏(事件监听器、定时器、闭包)
|
|
60
|
+
- 分析对象保留和垃圾回收
|
|
61
|
+
- 审查大型数据结构分配
|
|
62
|
+
- 监控堆大小随时间的增长
|
|
63
|
+
|
|
64
|
+
**常见问题:**
|
|
65
|
+
- 未关闭的数据库连接
|
|
66
|
+
- 未移除的事件监听器
|
|
67
|
+
- 循环引用
|
|
68
|
+
- 没有限制的大型内存缓存
|
|
69
|
+
|
|
70
|
+
### 3. I/O 操作
|
|
71
|
+
|
|
72
|
+
**文件系统:**
|
|
73
|
+
- 识别同步文件操作(fs.readFileSync)
|
|
74
|
+
- 检查不必要的文件读写
|
|
75
|
+
- 审查文件流式处理 vs. 加载整个文件
|
|
76
|
+
- 分析临时文件清理
|
|
77
|
+
|
|
78
|
+
**数据库:**
|
|
79
|
+
- 检测 N+1 查询问题
|
|
80
|
+
- 审查缺失的索引
|
|
81
|
+
- 检查全表扫描
|
|
82
|
+
- 分析连接池使用情况
|
|
83
|
+
|
|
84
|
+
### 4. 网络请求
|
|
85
|
+
|
|
86
|
+
**HTTP/API 调用:**
|
|
87
|
+
- 识别可以并行的顺序请求
|
|
88
|
+
- 检查缺失的请求缓存
|
|
89
|
+
- 审查超时配置
|
|
90
|
+
- 分析负载大小
|
|
91
|
+
|
|
92
|
+
**优化机会:**
|
|
93
|
+
- 实现请求批处理
|
|
94
|
+
- 添加响应缓存(Redis、内存)
|
|
95
|
+
- 使用 HTTP/2 多路复用
|
|
96
|
+
- 压缩请求/响应负载
|
|
97
|
+
|
|
98
|
+
### 5. 打包体积分析
|
|
99
|
+
|
|
100
|
+
**前端性能:**
|
|
101
|
+
- 分析打包体积和组成
|
|
102
|
+
- 检查重复依赖
|
|
103
|
+
- 审查代码拆分策略
|
|
104
|
+
- 识别未使用的代码(tree-shaking 机会)
|
|
105
|
+
|
|
106
|
+
**工具:**
|
|
107
|
+
- webpack-bundle-analyzer
|
|
108
|
+
- source-map-explorer
|
|
109
|
+
- Lighthouse CI
|
|
110
|
+
|
|
111
|
+
## 常见性能问题
|
|
112
|
+
|
|
113
|
+
### 1. N+1 查询问题
|
|
114
|
+
|
|
115
|
+
**症状:**
|
|
116
|
+
```javascript
|
|
117
|
+
// 不好:N+1 查询
|
|
118
|
+
const users = await User.findAll();
|
|
119
|
+
for (const user of users) {
|
|
120
|
+
user.posts = await Post.findAll({ where: { userId: user.id } });
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
**解决方案:**
|
|
125
|
+
```javascript
|
|
126
|
+
// 好:使用 join 的单次查询
|
|
127
|
+
const users = await User.findAll({
|
|
128
|
+
include: [{ model: Post }]
|
|
129
|
+
});
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### 2. 内存泄漏
|
|
133
|
+
|
|
134
|
+
**常见原因:**
|
|
135
|
+
```javascript
|
|
136
|
+
// 不好:事件监听器未移除
|
|
137
|
+
element.addEventListener('click', handler);
|
|
138
|
+
// 组件卸载但监听器仍然存在
|
|
139
|
+
|
|
140
|
+
// 不好:定时器未清除
|
|
141
|
+
setInterval(() => { /* ... */ }, 1000);
|
|
142
|
+
// 组件卸载但定时器继续运行
|
|
143
|
+
|
|
144
|
+
// 不好:闭包保留大对象
|
|
145
|
+
function createHandler() {
|
|
146
|
+
const largeData = new Array(1000000);
|
|
147
|
+
return () => console.log(largeData.length);
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
**解决方案:**
|
|
152
|
+
```javascript
|
|
153
|
+
// 好:清理事件监听器
|
|
154
|
+
useEffect(() => {
|
|
155
|
+
element.addEventListener('click', handler);
|
|
156
|
+
return () => element.removeEventListener('click', handler);
|
|
157
|
+
}, []);
|
|
158
|
+
|
|
159
|
+
// 好:清除定时器
|
|
160
|
+
useEffect(() => {
|
|
161
|
+
const timer = setInterval(() => { /* ... */ }, 1000);
|
|
162
|
+
return () => clearInterval(timer);
|
|
163
|
+
}, []);
|
|
164
|
+
|
|
165
|
+
// 好:避免不必要的闭包
|
|
166
|
+
function createHandler() {
|
|
167
|
+
return () => console.log('不保留大数据');
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### 3. 不必要的重新渲染(React)
|
|
172
|
+
|
|
173
|
+
**问题:**
|
|
174
|
+
```javascript
|
|
175
|
+
// 不好:每次渲染都创建新对象
|
|
176
|
+
function Component() {
|
|
177
|
+
const config = { theme: 'dark' }; // 每次都是新对象
|
|
178
|
+
return <Child config={config} />;
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
**解决方案:**
|
|
183
|
+
```javascript
|
|
184
|
+
// 好:记忆化对象
|
|
185
|
+
function Component() {
|
|
186
|
+
const config = useMemo(() => ({ theme: 'dark' }), []);
|
|
187
|
+
return <Child config={config} />;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// 好:对昂贵组件使用 React.memo
|
|
191
|
+
const Child = React.memo(({ config }) => {
|
|
192
|
+
// 昂贵的渲染逻辑
|
|
193
|
+
});
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### 4. 大型打包体积
|
|
197
|
+
|
|
198
|
+
**问题:**
|
|
199
|
+
- 为单个函数导入整个库
|
|
200
|
+
- 路由没有代码拆分
|
|
201
|
+
- 未优化的图片和资源
|
|
202
|
+
- 缺少压缩
|
|
203
|
+
|
|
204
|
+
**解决方案:**
|
|
205
|
+
```javascript
|
|
206
|
+
// 不好:导入整个库
|
|
207
|
+
import _ from 'lodash';
|
|
208
|
+
|
|
209
|
+
// 好:导入特定函数
|
|
210
|
+
import debounce from 'lodash/debounce';
|
|
211
|
+
|
|
212
|
+
// 好:动态导入进行代码拆分
|
|
213
|
+
const HeavyComponent = lazy(() => import('./HeavyComponent'));
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## 性能分析工具集成
|
|
217
|
+
|
|
218
|
+
### 1. Node.js 分析器
|
|
219
|
+
|
|
220
|
+
**CPU 分析:**
|
|
221
|
+
```bash
|
|
222
|
+
# 生成 CPU 分析文件
|
|
223
|
+
node --prof app.js
|
|
224
|
+
|
|
225
|
+
# 处理分析文件
|
|
226
|
+
node --prof-process isolate-0x*.log > processed.txt
|
|
227
|
+
|
|
228
|
+
# 分析输出中的热点函数
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**堆快照:**
|
|
232
|
+
```bash
|
|
233
|
+
# 获取堆快照
|
|
234
|
+
node --inspect app.js
|
|
235
|
+
# 在 Chrome 中打开 chrome://inspect
|
|
236
|
+
# 在 DevTools 中获取堆快照
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### 2. Chrome DevTools
|
|
240
|
+
|
|
241
|
+
**性能标签:**
|
|
242
|
+
1. 打开 DevTools (F12)
|
|
243
|
+
2. 转到性能标签
|
|
244
|
+
3. 点击录制
|
|
245
|
+
4. 执行要分析的操作
|
|
246
|
+
5. 停止录制
|
|
247
|
+
6. 分析火焰图查找瓶颈
|
|
248
|
+
|
|
249
|
+
**内存标签:**
|
|
250
|
+
1. 在操作前后获取堆快照
|
|
251
|
+
2. 比较快照以查找泄漏
|
|
252
|
+
3. 使用分配时间线进行实时监控
|
|
253
|
+
|
|
254
|
+
### 3. Lighthouse
|
|
255
|
+
|
|
256
|
+
**运行 Lighthouse:**
|
|
257
|
+
```bash
|
|
258
|
+
# CLI
|
|
259
|
+
npm install -g lighthouse
|
|
260
|
+
lighthouse https://example.com --view
|
|
261
|
+
|
|
262
|
+
# 编程方式
|
|
263
|
+
npm install lighthouse
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
**关键指标:**
|
|
267
|
+
- 首次内容绘制 (FCP)
|
|
268
|
+
- 最大内容绘制 (LCP)
|
|
269
|
+
- 可交互时间 (TTI)
|
|
270
|
+
- 总阻塞时间 (TBT)
|
|
271
|
+
- 累积布局偏移 (CLS)
|
|
272
|
+
|
|
273
|
+
### 4. 其他工具
|
|
274
|
+
|
|
275
|
+
**后端:**
|
|
276
|
+
- `clinic.js` - Node.js 性能分析
|
|
277
|
+
- `autocannon` - HTTP 负载测试
|
|
278
|
+
- `0x` - 火焰图分析器
|
|
279
|
+
|
|
280
|
+
**前端:**
|
|
281
|
+
- `react-devtools-profiler` - React 组件分析
|
|
282
|
+
- `why-did-you-render` - 检测不必要的重新渲染
|
|
283
|
+
- `bundle-analyzer` - Webpack 打包分析
|
|
284
|
+
|
|
285
|
+
## 优化策略
|
|
286
|
+
|
|
287
|
+
### 1. 算法优化
|
|
288
|
+
|
|
289
|
+
**策略:**
|
|
290
|
+
- 将 O(n²) 替换为 O(n log n) 或 O(n)
|
|
291
|
+
- 使用适当的数据结构(Map vs Object、Set vs Array)
|
|
292
|
+
- 为昂贵的计算实现缓存/记忆化
|
|
293
|
+
- 考虑惰性求值
|
|
294
|
+
|
|
295
|
+
**示例:**
|
|
296
|
+
```javascript
|
|
297
|
+
// 不好:O(n²) - 嵌套循环
|
|
298
|
+
function findDuplicates(arr) {
|
|
299
|
+
const duplicates = [];
|
|
300
|
+
for (let i = 0; i < arr.length; i++) {
|
|
301
|
+
for (let j = i + 1; j < arr.length; j++) {
|
|
302
|
+
if (arr[i] === arr[j]) duplicates.push(arr[i]);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
return duplicates;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// 好:O(n) - 使用 Set
|
|
309
|
+
function findDuplicates(arr) {
|
|
310
|
+
const seen = new Set();
|
|
311
|
+
const duplicates = new Set();
|
|
312
|
+
for (const item of arr) {
|
|
313
|
+
if (seen.has(item)) duplicates.add(item);
|
|
314
|
+
seen.add(item);
|
|
315
|
+
}
|
|
316
|
+
return Array.from(duplicates);
|
|
317
|
+
}
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### 2. 缓存策略
|
|
321
|
+
|
|
322
|
+
**层级:**
|
|
323
|
+
1. **内存缓存** - 快速,受 RAM 限制
|
|
324
|
+
2. **Redis 缓存** - 跨实例共享
|
|
325
|
+
3. **CDN 缓存** - 静态资源的边缘缓存
|
|
326
|
+
4. **浏览器缓存** - HTTP 缓存头
|
|
327
|
+
|
|
328
|
+
**实现:**
|
|
329
|
+
```javascript
|
|
330
|
+
// 带 TTL 的简单内存缓存
|
|
331
|
+
class Cache {
|
|
332
|
+
constructor(ttl = 60000) {
|
|
333
|
+
this.cache = new Map();
|
|
334
|
+
this.ttl = ttl;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
set(key, value) {
|
|
338
|
+
this.cache.set(key, {
|
|
339
|
+
value,
|
|
340
|
+
expires: Date.now() + this.ttl
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
get(key) {
|
|
345
|
+
const item = this.cache.get(key);
|
|
346
|
+
if (!item) return null;
|
|
347
|
+
if (Date.now() > item.expires) {
|
|
348
|
+
this.cache.delete(key);
|
|
349
|
+
return null;
|
|
350
|
+
}
|
|
351
|
+
return item.value;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
### 3. 数据库优化
|
|
357
|
+
|
|
358
|
+
**策略:**
|
|
359
|
+
- 在频繁查询的列上添加索引
|
|
360
|
+
- 使用连接池
|
|
361
|
+
- 实现查询结果缓存
|
|
362
|
+
- 优化 JOIN 操作
|
|
363
|
+
- 使用 EXPLAIN 分析查询计划
|
|
364
|
+
|
|
365
|
+
**示例:**
|
|
366
|
+
```sql
|
|
367
|
+
-- 添加索引
|
|
368
|
+
CREATE INDEX idx_user_email ON users(email);
|
|
369
|
+
|
|
370
|
+
-- 分析查询
|
|
371
|
+
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
### 4. 懒加载
|
|
375
|
+
|
|
376
|
+
**代码拆分:**
|
|
377
|
+
```javascript
|
|
378
|
+
// React 懒加载
|
|
379
|
+
const Dashboard = lazy(() => import('./Dashboard'));
|
|
380
|
+
|
|
381
|
+
// 基于路由的拆分
|
|
382
|
+
const routes = [
|
|
383
|
+
{
|
|
384
|
+
path: '/dashboard',
|
|
385
|
+
component: lazy(() => import('./Dashboard'))
|
|
386
|
+
}
|
|
387
|
+
];
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
**图片懒加载:**
|
|
391
|
+
```html
|
|
392
|
+
<!-- 原生懒加载 -->
|
|
393
|
+
<img src="image.jpg" loading="lazy" alt="描述">
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
### 5. 防抖和节流
|
|
397
|
+
|
|
398
|
+
**使用场景:**
|
|
399
|
+
- 搜索输入(防抖)
|
|
400
|
+
- 滚动事件(节流)
|
|
401
|
+
- 窗口调整大小(节流)
|
|
402
|
+
- API 调用(防抖)
|
|
403
|
+
|
|
404
|
+
**实现:**
|
|
405
|
+
```javascript
|
|
406
|
+
// 防抖:等待事件暂停
|
|
407
|
+
function debounce(fn, delay) {
|
|
408
|
+
let timeoutId;
|
|
409
|
+
return (...args) => {
|
|
410
|
+
clearTimeout(timeoutId);
|
|
411
|
+
timeoutId = setTimeout(() => fn(...args), delay);
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
// 节流:限制执行频率
|
|
416
|
+
function throttle(fn, limit) {
|
|
417
|
+
let inThrottle;
|
|
418
|
+
return (...args) => {
|
|
419
|
+
if (!inThrottle) {
|
|
420
|
+
fn(...args);
|
|
421
|
+
inThrottle = true;
|
|
422
|
+
setTimeout(() => inThrottle = false, limit);
|
|
423
|
+
}
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
## 性能报告格式
|
|
429
|
+
|
|
430
|
+
### 执行摘要
|
|
431
|
+
|
|
432
|
+
```markdown
|
|
433
|
+
## 性能分析报告
|
|
434
|
+
|
|
435
|
+
**日期:** [YYYY-MM-DD]
|
|
436
|
+
**分析文件数:** [数量]
|
|
437
|
+
**严重问题:** [数量]
|
|
438
|
+
**优化机会:** [数量]
|
|
439
|
+
|
|
440
|
+
### 总体性能评分:[X/10]
|
|
441
|
+
|
|
442
|
+
**关键发现:**
|
|
443
|
+
1. [最严重的问题]
|
|
444
|
+
2. [第二严重的问题]
|
|
445
|
+
3. [第三严重的问题]
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
### 详细分析
|
|
449
|
+
|
|
450
|
+
```markdown
|
|
451
|
+
## 1. 算法复杂度问题
|
|
452
|
+
|
|
453
|
+
### 问题:[描述]
|
|
454
|
+
- **位置:** `path/to/file.js:123`
|
|
455
|
+
- **当前复杂度:** O(n²)
|
|
456
|
+
- **影响:** 高 - 在热路径中执行
|
|
457
|
+
- **建议:** 使用 Map 实现 O(n) 查找
|
|
458
|
+
|
|
459
|
+
**修改前:**
|
|
460
|
+
\`\`\`javascript
|
|
461
|
+
[有问题的代码]
|
|
462
|
+
\`\`\`
|
|
463
|
+
|
|
464
|
+
**修改后:**
|
|
465
|
+
\`\`\`javascript
|
|
466
|
+
[优化后的代码]
|
|
467
|
+
\`\`\`
|
|
468
|
+
|
|
469
|
+
**预期改进:** n=1000 时快 10 倍
|
|
470
|
+
|
|
471
|
+
---
|
|
472
|
+
|
|
473
|
+
## 2. 内存问题
|
|
474
|
+
|
|
475
|
+
### 问题:[描述]
|
|
476
|
+
- **位置:** `path/to/file.js:456`
|
|
477
|
+
- **类型:** 内存泄漏 - 事件监听器未移除
|
|
478
|
+
- **影响:** 中等 - 随时间增长
|
|
479
|
+
- **建议:** 在 useEffect 中添加清理
|
|
480
|
+
|
|
481
|
+
[每个问题使用类似格式]
|
|
482
|
+
|
|
483
|
+
---
|
|
484
|
+
|
|
485
|
+
## 3. 打包体积分析
|
|
486
|
+
|
|
487
|
+
**当前大小:** 2.5 MB(未压缩)
|
|
488
|
+
**Gzip 后:** 850 KB
|
|
489
|
+
|
|
490
|
+
**最大依赖项:**
|
|
491
|
+
1. lodash - 500 KB(使用 lodash-es 或特定导入)
|
|
492
|
+
2. moment - 300 KB(替换为 date-fns 或 dayjs)
|
|
493
|
+
3. [其他大型依赖]
|
|
494
|
+
|
|
495
|
+
**建议:**
|
|
496
|
+
- 实现代码拆分:初始包减少 40%
|
|
497
|
+
- 用 dayjs 替换 moment:减少 280 KB
|
|
498
|
+
- 使用 lodash-es 配合 tree-shaking:减少 400 KB
|
|
499
|
+
|
|
500
|
+
**预计最终大小:** 1.2 MB(减少 52%)
|
|
501
|
+
|
|
502
|
+
---
|
|
503
|
+
|
|
504
|
+
## 4. 网络性能
|
|
505
|
+
|
|
506
|
+
**发现的问题:**
|
|
507
|
+
- 15 个顺序 API 调用(应该并行)
|
|
508
|
+
- 没有请求缓存
|
|
509
|
+
- 大负载大小(平均 200 KB)
|
|
510
|
+
|
|
511
|
+
**建议:**
|
|
512
|
+
1. 使用 Promise.all() 进行并行请求
|
|
513
|
+
2. 为频繁查询实现 Redis 缓存
|
|
514
|
+
3. 添加响应压缩(gzip)
|
|
515
|
+
|
|
516
|
+
**预期改进:**
|
|
517
|
+
- API 响应时间:减少 60%
|
|
518
|
+
- 服务器负载:减少 40%
|
|
519
|
+
|
|
520
|
+
---
|
|
521
|
+
|
|
522
|
+
## 优先行动项
|
|
523
|
+
|
|
524
|
+
### 高优先级(首先执行)
|
|
525
|
+
1. [ ] 修复用户仪表板中的 N+1 查询(10 倍加速)
|
|
526
|
+
2. [ ] 在 users.email 列上添加索引(5 倍加速)
|
|
527
|
+
3. [ ] 移除 WebSocket 处理器中的内存泄漏
|
|
528
|
+
|
|
529
|
+
### 中优先级(接下来执行)
|
|
530
|
+
1. [ ] 为路由实现代码拆分
|
|
531
|
+
2. [ ] 用 dayjs 替换 moment
|
|
532
|
+
3. [ ] 为 API 响应添加 Redis 缓存
|
|
533
|
+
|
|
534
|
+
### 低优先级(锦上添花)
|
|
535
|
+
1. [ ] 使用懒加载优化图片加载
|
|
536
|
+
2. [ ] 实现 service worker 以支持离线
|
|
537
|
+
3. [ ] 在 CI 中添加打包体积监控
|
|
538
|
+
|
|
539
|
+
---
|
|
540
|
+
|
|
541
|
+
## 监控建议
|
|
542
|
+
|
|
543
|
+
**要跟踪的指标:**
|
|
544
|
+
- 响应时间(p50、p95、p99)
|
|
545
|
+
- 内存使用(堆大小、GC 频率)
|
|
546
|
+
- 打包体积(随时间跟踪)
|
|
547
|
+
- Lighthouse 评分(每周)
|
|
548
|
+
|
|
549
|
+
**要实现的工具:**
|
|
550
|
+
- 应用性能监控(APM)
|
|
551
|
+
- 真实用户监控(RUM)
|
|
552
|
+
- 关键路径的合成监控
|
|
553
|
+
|
|
554
|
+
---
|
|
555
|
+
|
|
556
|
+
## 结论
|
|
557
|
+
|
|
558
|
+
**预计总体改进:**
|
|
559
|
+
- 响应时间:减少 50%
|
|
560
|
+
- 内存使用:减少 30%
|
|
561
|
+
- 打包体积:减少 52%
|
|
562
|
+
- 用户体验:显著改善
|
|
563
|
+
|
|
564
|
+
**后续步骤:**
|
|
565
|
+
1. 审查并优先处理行动项
|
|
566
|
+
2. 实施高优先级修复
|
|
567
|
+
3. 设置性能监控
|
|
568
|
+
4. 安排 2 周后的后续分析
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
## 使用示例
|
|
572
|
+
|
|
573
|
+
### 示例 1:分析特定文件
|
|
574
|
+
|
|
575
|
+
```
|
|
576
|
+
用户:/perf 分析 src/api/users.ts
|
|
577
|
+
|
|
578
|
+
助手:我将对 src/api/users.ts 进行全面的性能分析...
|
|
579
|
+
|
|
580
|
+
[读取文件并分析]
|
|
581
|
+
|
|
582
|
+
## 性能分析报告 - src/api/users.ts
|
|
583
|
+
|
|
584
|
+
### 发现的问题:
|
|
585
|
+
|
|
586
|
+
1. **N+1 查询问题**(严重)
|
|
587
|
+
- 位置:第 45-50 行
|
|
588
|
+
- 在循环中为每个用户执行单独的查询
|
|
589
|
+
- 建议:使用 include 进行单次查询
|
|
590
|
+
|
|
591
|
+
2. **缺少索引**(高)
|
|
592
|
+
- email 字段上没有索引
|
|
593
|
+
- 影响登录性能
|
|
594
|
+
- 建议:添加 `CREATE INDEX idx_user_email ON users(email)`
|
|
595
|
+
|
|
596
|
+
[完整报告...]
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
### 示例 2:分析整个项目
|
|
600
|
+
|
|
601
|
+
```
|
|
602
|
+
用户:/perf 分析整个项目的性能
|
|
603
|
+
|
|
604
|
+
助手:我将对整个项目进行性能分析...
|
|
605
|
+
|
|
606
|
+
[扫描所有文件]
|
|
607
|
+
|
|
608
|
+
## 项目性能分析报告
|
|
609
|
+
|
|
610
|
+
### 总体评分:6.5/10
|
|
611
|
+
|
|
612
|
+
**关键发现:**
|
|
613
|
+
1. 5 个 N+1 查询问题
|
|
614
|
+
2. 3 个潜在的内存泄漏
|
|
615
|
+
3. 打包体积过大(2.5 MB)
|
|
616
|
+
4. 15 个可以并行的顺序 API 调用
|
|
617
|
+
|
|
618
|
+
[按模块详细分析...]
|
|
619
|
+
```
|
|
620
|
+
|
|
621
|
+
### 示例 3:特定性能问题
|
|
622
|
+
|
|
623
|
+
```
|
|
624
|
+
用户:/perf 为什么我的 API 这么慢?
|
|
625
|
+
|
|
626
|
+
助手:让我分析您的 API 性能...
|
|
627
|
+
|
|
628
|
+
[分析 API 路由和处理器]
|
|
629
|
+
|
|
630
|
+
## API 性能分析
|
|
631
|
+
|
|
632
|
+
### 发现的瓶颈:
|
|
633
|
+
|
|
634
|
+
1. **数据库查询慢**
|
|
635
|
+
- 缺少索引导致全表扫描
|
|
636
|
+
- N+1 查询模式
|
|
637
|
+
- 预计改进:5-10 倍加速
|
|
638
|
+
|
|
639
|
+
2. **没有缓存**
|
|
640
|
+
- 每次请求都查询数据库
|
|
641
|
+
- 建议:添加 Redis 缓存
|
|
642
|
+
- 预计改进:响应时间减少 80%
|
|
643
|
+
|
|
644
|
+
3. **顺序处理**
|
|
645
|
+
- 可以并行的操作按顺序执行
|
|
646
|
+
- 建议:使用 Promise.all()
|
|
647
|
+
- 预计改进:响应时间减少 60%
|
|
648
|
+
|
|
649
|
+
[详细建议和代码示例...]
|
|
650
|
+
```
|
|
651
|
+
|
|
652
|
+
### 示例 4:内存泄漏检测
|
|
653
|
+
|
|
654
|
+
```
|
|
655
|
+
用户:/perf 检查内存泄漏
|
|
656
|
+
|
|
657
|
+
助手:我将扫描常见的内存泄漏模式...
|
|
658
|
+
|
|
659
|
+
[分析事件监听器、定时器、闭包]
|
|
660
|
+
|
|
661
|
+
## 内存泄漏分析
|
|
662
|
+
|
|
663
|
+
### 发现的问题:
|
|
664
|
+
|
|
665
|
+
1. **未清理的事件监听器**(3 处)
|
|
666
|
+
- src/components/Chat.tsx:67
|
|
667
|
+
- src/services/websocket.ts:123
|
|
668
|
+
- src/utils/observer.ts:45
|
|
669
|
+
|
|
670
|
+
2. **未清除的定时器**(2 处)
|
|
671
|
+
- src/components/Timer.tsx:34
|
|
672
|
+
- src/services/polling.ts:89
|
|
673
|
+
|
|
674
|
+
3. **闭包保留大对象**(1 处)
|
|
675
|
+
- src/utils/cache.ts:156
|
|
676
|
+
|
|
677
|
+
[每个问题的详细修复方案...]
|
|
678
|
+
```
|
|
679
|
+
|
|
680
|
+
## 最佳实践
|
|
681
|
+
|
|
682
|
+
### 性能分析流程
|
|
683
|
+
|
|
684
|
+
1. **建立基线**
|
|
685
|
+
- 在优化前测量当前性能
|
|
686
|
+
- 记录关键指标(响应时间、内存使用、打包体积)
|
|
687
|
+
|
|
688
|
+
2. **识别瓶颈**
|
|
689
|
+
- 使用分析工具找到热点
|
|
690
|
+
- 专注于影响最大的问题
|
|
691
|
+
|
|
692
|
+
3. **实施优化**
|
|
693
|
+
- 一次优化一个问题
|
|
694
|
+
- 每次优化后测量改进
|
|
695
|
+
|
|
696
|
+
4. **验证改进**
|
|
697
|
+
- 确认性能提升
|
|
698
|
+
- 确保没有引入新问题
|
|
699
|
+
|
|
700
|
+
5. **持续监控**
|
|
701
|
+
- 设置性能监控
|
|
702
|
+
- 定期审查性能指标
|
|
703
|
+
|
|
704
|
+
### 优化优先级
|
|
705
|
+
|
|
706
|
+
1. **高影响、低努力** - 首先执行
|
|
707
|
+
- 添加数据库索引
|
|
708
|
+
- 修复 N+1 查询
|
|
709
|
+
- 实现简单缓存
|
|
710
|
+
|
|
711
|
+
2. **高影响、高努力** - 接下来执行
|
|
712
|
+
- 重构算法
|
|
713
|
+
- 实现代码拆分
|
|
714
|
+
- 优化数据库架构
|
|
715
|
+
|
|
716
|
+
3. **低影响、低努力** - 有时间时执行
|
|
717
|
+
- 小的代码优化
|
|
718
|
+
- 图片优化
|
|
719
|
+
- 压缩配置
|
|
720
|
+
|
|
721
|
+
4. **低影响、高努力** - 最后考虑
|
|
722
|
+
- 过度优化
|
|
723
|
+
- 边缘情况优化
|
|
724
|
+
|
|
725
|
+
## 注意事项
|
|
726
|
+
|
|
727
|
+
1. **过早优化是万恶之源**
|
|
728
|
+
- 先让代码工作,再让它快速
|
|
729
|
+
- 基于实际数据进行优化,而非假设
|
|
730
|
+
|
|
731
|
+
2. **测量,不要猜测**
|
|
732
|
+
- 始终使用分析工具
|
|
733
|
+
- 验证优化效果
|
|
734
|
+
|
|
735
|
+
3. **权衡取舍**
|
|
736
|
+
- 性能 vs. 可读性
|
|
737
|
+
- 性能 vs. 可维护性
|
|
738
|
+
- 优化成本 vs. 收益
|
|
739
|
+
|
|
740
|
+
4. **用户体验优先**
|
|
741
|
+
- 专注于用户感知的性能
|
|
742
|
+
- 优化关键用户路径
|
|
743
|
+
|
|
744
|
+
5. **持续改进**
|
|
745
|
+
- 性能优化是持续的过程
|
|
746
|
+
- 定期审查和更新
|