# 性能优化规则

## 你必须遵守的优化原则

### 1. 先测量，后优化原则（必须遵守）

**执行要求：**

- **禁止**：在没有测量的情况下进行优化
- **必须**：使用性能分析工具找出瓶颈
- **必须**：基于实际数据决定优化方向
- **禁止**：过早优化（在性能问题未确认前）

**测量方法：**

- 使用性能分析工具（如 profiler）
- 测量关键路径的执行时间
- 测量资源使用情况（CPU、内存、I/O）
- 建立性能基准（benchmark）

**优化流程：**

1. 测量当前性能
2. 识别性能瓶颈
3. 优化瓶颈点
4. 再次测量，确认优化效果
5. 如果未达到目标，重复步骤 2-4

### 2. 算法和数据结构选择原则（必须遵守）

**执行要求：**

- **必须**：选择合适的数据结构
- **必须**：理解算法的时间复杂度
- **必须**：考虑空间换时间的权衡
- **必须**：根据数据规模选择算法

**选择标准：**

- 时间复杂度：O(1) > O(log n) > O(n) > O(n log n) > O(n²)
- 空间复杂度：考虑内存限制
- 数据特征：有序/无序、重复/唯一、大小等
- 操作频率：读多写少 vs 写多读少

### 3. 资源管理原则（必须遵守）

**执行要求：**

- **必须**：及时释放资源（文件、网络连接、数据库连接等）
- **必须**：使用连接池管理资源
- **必须**：避免内存泄漏
- **禁止**：持有资源不释放

**资源管理：**

- 使用 try-finally 或 with 语句确保资源释放
- 使用连接池复用连接
- 及时关闭文件、网络连接
- 清理不再使用的对象引用

## 你必须掌握的优化技巧

### 1. 缓存策略（必须考虑）

**何时使用：**

- 计算结果重复使用
- 数据读取频繁但变化少
- 网络请求结果可以缓存

**实施要求：**

- **必须**：使用适当的缓存策略（LRU、FIFO、TTL 等）
- **必须**：注意缓存失效和更新
- **必须**：考虑缓存大小限制
- **禁止**：缓存敏感数据（除非加密）

### 2. 批量处理（必须考虑）

**何时使用：**

- 数据库操作频繁
- 网络请求可以合并
- 循环中有重复计算

**实施要求：**

- **必须**：批量处理数据库操作（批量插入、更新）
- **必须**：批量发送网络请求
- **必须**：减少循环中的重复计算
- **必须**：使用批量 API 而非循环调用

### 3. 异步处理（必须考虑）

**何时使用：**

- I/O 操作（文件、网络、数据库）
- 独立任务可以并行
- 耗时任务不影响主流程

**实施要求：**

- **必须**：使用异步 I/O 处理阻塞操作
- **必须**：并行处理独立任务
- **必须**：使用消息队列处理耗时任务
- **必须**：合理控制并发数量

### 4. 数据库优化（必须考虑）

**优化要求：**

- **必须**：在查询字段上创建索引
- **必须**：避免 N+1 查询问题
- **必须**：使用分页而非加载全部数据
- **必须**：优化查询语句（避免全表扫描）

**查询优化：**

- 使用索引加速查询
- 使用 JOIN 而非多次查询
- 使用 LIMIT 限制返回数量
- 避免 SELECT \*，只查询需要的字段

## 性能优化检查清单

在完成代码后，你必须确认：

**性能测量：**

- [ ] 已识别并优化了性能瓶颈
- [ ] 使用性能分析工具验证了优化效果
- [ ] 建立了性能基准并持续监控

**算法和数据结构：**

- [ ] 使用了合适的数据结构和算法
- [ ] 理解了算法的时间复杂度
- [ ] 考虑了空间换时间的权衡

**资源管理：**

- [ ] 资源被正确释放
- [ ] 使用了连接池（如适用）
- [ ] 没有内存泄漏

**优化技巧应用：**

- [ ] 避免了不必要的计算
- [ ] 使用了适当的缓存策略
- [ ] 实施了批量处理（如适用）
- [ ] 使用了异步处理（如适用）

**数据库优化：**

- [ ] 数据库查询被优化
- [ ] 使用了索引
- [ ] 避免了 N+1 查询
- [ ] 考虑了并发性能
