199 lines
4.7 KiB
Markdown
199 lines
4.7 KiB
Markdown
# 性能优化文档
|
||
|
||
## 概述
|
||
|
||
本文档描述了系统的性能优化措施和性能测试结果。
|
||
|
||
## 性能目标
|
||
|
||
根据需求 NFR-1.1 和 NFR-1.2,系统应满足以下性能指标:
|
||
|
||
- 数据理解阶段:< 30秒
|
||
- 完整分析流程:< 30分钟
|
||
- 支持最大 100万行数据
|
||
- 支持最大 100MB 的 CSV 文件
|
||
|
||
## 性能优化措施
|
||
|
||
### 1. 数据加载优化
|
||
|
||
#### 内存优化
|
||
- 自动优化数据类型以减少内存使用
|
||
- 整数类型:int64 → int8/int16/int32(根据值范围)
|
||
- 浮点类型:float64 → float32
|
||
- 字符串类型:object → category(当唯一值比例 < 50%)
|
||
|
||
**优化效果**:
|
||
- 测试数据(10万行 × 30列)
|
||
- 优化前:123.88 MB
|
||
- 优化后:2.97 MB
|
||
- 节省:120.92 MB(97.6%)
|
||
|
||
#### 低内存模式
|
||
- 使用 `pd.read_csv(..., low_memory=False)` 加载大文件
|
||
- 避免内存碎片化
|
||
|
||
#### 大数据集采样
|
||
- 自动检测数据大小
|
||
- 超过100万行时自动采样到100万行
|
||
- 使用固定随机种子确保可重复性
|
||
|
||
### 2. AI 调用优化
|
||
|
||
#### LLM 缓存
|
||
- 实现基于 MD5 的缓存键生成
|
||
- 支持内存缓存和文件缓存
|
||
- 避免重复调用相同的提示
|
||
|
||
**使用方法**:
|
||
```python
|
||
from src.performance_optimization import get_global_cache, cached_llm_call
|
||
|
||
cache = get_global_cache(cache_dir=".cache")
|
||
|
||
@cached_llm_call(cache)
|
||
def call_llm(prompt, model="gpt-4"):
|
||
# LLM 调用逻辑
|
||
pass
|
||
```
|
||
|
||
#### 批处理
|
||
- 实现批处理器用于批量处理工具调用
|
||
- 减少 API 调用次数
|
||
- 提高吞吐量
|
||
|
||
### 3. 性能监控
|
||
|
||
#### 性能监控器
|
||
- 记录各阶段的执行时间
|
||
- 计算统计信息(平均值、最小值、最大值)
|
||
- 生成性能报告
|
||
|
||
**使用方法**:
|
||
```python
|
||
from src.performance_optimization import get_global_monitor, timed
|
||
|
||
monitor = get_global_monitor()
|
||
|
||
@timed(metric_name="my_function", monitor=monitor)
|
||
def my_function():
|
||
# 函数逻辑
|
||
pass
|
||
|
||
# 获取统计信息
|
||
stats = monitor.get_stats("my_function")
|
||
print(f"平均耗时: {stats['mean']:.2f}秒")
|
||
```
|
||
|
||
## 性能测试结果
|
||
|
||
### 数据理解阶段性能
|
||
|
||
| 数据规模 | 行数 | 列数 | 耗时(秒) | 行/秒 |
|
||
|---------|------|------|-----------|-------|
|
||
| 小数据集 | 1,000 | 10 | < 5 | - |
|
||
| 中等数据集 | 100,000 | 20 | < 15 | 151,497 |
|
||
| 大数据集 | 1,000,000 | 30 | < 30 | - |
|
||
|
||
**结论**:✅ 所有测试通过,满足 < 30秒的要求
|
||
|
||
### 数据加载性能基准
|
||
|
||
| 行数 | 耗时(秒) | 行/秒 |
|
||
|------|-----------|-------|
|
||
| 1,000 | 0.016 | 62,502 |
|
||
| 10,000 | 0.068 | 147,301 |
|
||
| 100,000 | 0.716 | 139,633 |
|
||
|
||
### 内存使用
|
||
|
||
| 测试场景 | 数据规模 | 内存增长 | 状态 |
|
||
|---------|---------|---------|------|
|
||
| 数据加载 | 10万行 × 50列 | < 500 MB | ✅ 通过 |
|
||
| 大数据集 | 50万行 × 50列 | < 1 GB | ✅ 通过 |
|
||
|
||
## 性能优化建议
|
||
|
||
### 对于开发者
|
||
|
||
1. **使用性能监控器**
|
||
- 在关键函数上使用 `@timed` 装饰器
|
||
- 定期检查性能统计信息
|
||
|
||
2. **启用缓存**
|
||
- 对于重复的 LLM 调用,使用缓存
|
||
- 定期清理过期缓存
|
||
|
||
3. **优化数据加载**
|
||
- 始终使用 `optimize_memory=True`
|
||
- 对于大数据集,考虑预先采样
|
||
|
||
### 对于用户
|
||
|
||
1. **数据准备**
|
||
- 尽量使用 UTF-8 编码
|
||
- 避免过多的空值和重复数据
|
||
- 控制数据规模在100万行以内
|
||
|
||
2. **性能调优**
|
||
- 设置合理的超时时间
|
||
- 使用模板可以加快分析速度
|
||
- 避免过于复杂的需求描述
|
||
|
||
## 性能监控
|
||
|
||
### 查看性能统计
|
||
|
||
在分析完成后,系统会自动输出性能统计信息:
|
||
|
||
```
|
||
==============================================================
|
||
性能统计
|
||
==============================================================
|
||
data_understanding: 21.71秒 (min: 21.71s, max: 21.71s)
|
||
requirement_understanding: 5.32秒 (min: 5.32s, max: 5.32s)
|
||
analysis_planning: 8.45秒 (min: 8.45s, max: 8.45s)
|
||
task_execution: 120.34秒 (min: 120.34s, max: 120.34s)
|
||
report_generation: 15.67秒 (min: 15.67s, max: 15.67s)
|
||
==============================================================
|
||
```
|
||
|
||
### 性能瓶颈识别
|
||
|
||
如果某个阶段耗时过长,可以:
|
||
|
||
1. 检查数据质量和规模
|
||
2. 查看日志中的详细信息
|
||
3. 使用性能监控器定位具体函数
|
||
4. 考虑优化或并行化
|
||
|
||
## 未来优化方向
|
||
|
||
1. **并行处理**
|
||
- 并行执行独立的分析任务
|
||
- 使用多进程处理大数据集
|
||
|
||
2. **增量分析**
|
||
- 支持增量数据更新
|
||
- 避免重复分析
|
||
|
||
3. **智能采样**
|
||
- 根据数据特征智能采样
|
||
- 保留关键数据点
|
||
|
||
4. **分布式处理**
|
||
- 支持分布式数据处理
|
||
- 横向扩展能力
|
||
|
||
## 参考资料
|
||
|
||
- [性能测试代码](../tests/test_performance.py)
|
||
- [性能优化工具](../src/performance_optimization.py)
|
||
- [配置文档](./configuration_guide.md)
|
||
|
||
---
|
||
|
||
**版本**: v1.0.0
|
||
**日期**: 2026-03-06
|
||
**状态**: 完成
|