# iFlow CLI 性能分析报告
## 📊 性能数据概览
```
总耗时: 13分35秒 (815秒)
iFlow 活动时间: 59.9秒
└─ API 时间: 14.1秒 (23.5%)
└─ 工具时间: 45.8秒 (76.5%) ⚠️
工具调用: 2次
成功率: 100%
模型: glm-4.7
输入 Token: 97,193
输出 Token: 924
```
---
## 🔍 问题分析
### 问题 1: 工具时间过长 (45.8秒)
**当前状态**: 工具时间占总活动时间的 **76.5%**
**原因分析**:
1. **豆包 API 调用慢**: 单次图片描述可能需要 20-30 秒
2. **图片文件大小**: 本地文件编码为 Base64 需要时间
3. **网络延迟**: 与豆包 API 服务器的通信延迟
4. **两次工具调用**: 可能是描述了2张图片
**估算**:
```
单次工具调用时间 ≈ 45.8秒 / 2 = 22.9秒/次
```
### 问题 2: 总耗时与活动时间差距大
**差距**: 815秒 - 59.9秒 = **755秒 (12.6分钟)** 的非活动时间
**原因**:
- 用户思考和输入时间
- 等待用户响应
- 阅读输出结果的时间
- 其他系统开销
### 问题 3: API Token 使用量高
**输入 Token: 97,193** - 这是相当高的!
**可能原因**:
- iFlow 将大量上下文(代码、文件等)包含在请求中
- 图片 Base64 编码占用大量 Token
- MCP 工具定义和说明占用 Token
---
## 💡 优化建议
### 1. 减少 Base64 编码时间 ⭐⭐⭐
**当前流程**:
```
本地文件 → 读取 → Base64编码 → 调用API
└─ 编码大文件可能需要 5-10秒
```
**优化方案**:
```python
# 在 server.py 中添加图片预处理
from PIL import Image
import io
def optimize_image_before_encoding(image_path: str, max_size: tuple = (1920, 1080)) -> bytes:
"""优化图片:调整大小并转换为 JPEG 格式"""
img = Image.open(image_path)
# 调整大小(如果太大)
if img.size[0] > max_size[0] or img.size[1] > max_size[1]:
img.thumbnail(max_size, Image.LANCZOS)
# 转换为 RGB(如果是 RGBA 或其他格式)
if img.mode != 'RGB':
img = img.convert('RGB')
# 压缩为 JPEG
buffer = io.BytesIO()
img.save(buffer, format='JPEG', quality=85)
return buffer.getvalue()
# 编码时间可从 5-10秒 降低到 1-2秒
```
**预期改进**:
- 编码时间减少 60-80%
- Base64 字符串更短(减少 Token 使用)
- API 响应更快
---
### 2. 添加图片大小和格式验证 ⭐⭐⭐
**在编码前检查**:
```python
def validate_image_file(image_path: str) -> tuple[bool, str]:
"""验证图片文件"""
path = Path(image_path)
# 检查文件大小
size_mb = path.stat().st_size / (1024 * 1024)
if size_mb > 10: # 大于 10MB
return False, f"文件过大 ({size_mb:.1f}MB),建议小于 10MB"
# 检查图片尺寸
try:
with Image.open(image_path) as img:
width, height = img.size
pixels = width * height
if pixels > 1920 * 1080: # 大于 2K 分辨率
return False, f"图片分辨率过大 ({width}x{height}),建议压缩"
except Exception as e:
return False, f"无法读取图片: {e}"
return True, ""
```
**预期改进**:
- 提前拒绝过大的文件
- 避免浪费编码时间
- 更好的用户体验
---
### 3. 添加缓存机制 ⭐⭐
**缓存策略**:
```python
import hashlib
import json
from pathlib import Path
class ImageDescriptionCache:
def __init__(self, cache_dir: str = "~/.iflow/cache/doubao-image"):
self.cache_dir = Path(cache_dir).expanduser()
self.cache_dir.mkdir(parents=True, exist_ok=True)
def get_cache_key(self, image_path: str, model: str, prompt: str) -> str:
"""生成缓存键"""
path_hash = hashlib.md5(str(image_path).encode()).hexdigest()
content_hash = self._get_file_hash(image_path)
return f"{model}_{prompt}_{content_hash}"
def _get_file_hash(self, file_path: str) -> str:
"""获取文件内容哈希"""
with open(file_path, 'rb') as f:
return hashlib.md5(f.read()).hexdigest()[:8]
def get(self, image_path: str, model: str, prompt: str) -> str | None:
"""获取缓存"""
key = self.get_cache_key(image_path, model, prompt)
cache_file = self.cache_dir / f"{key}.json"
if cache_file.exists():
with open(cache_file, 'r', encoding='utf-8') as f:
data = json.load(f)
return data.get('description')
return None
def set(self, image_path: str, model: str, prompt: str, description: str):
"""设置缓存"""
key = self.get_cache_key(image_path, model, prompt)
cache_file = self.cache_dir / f"{key}.json"
with open(cache_file, 'w', encoding='utf-8') as f:
json.dump({
'description': description,
'timestamp': time.time(),
'image_path': image_path,
'model': model,
'prompt': prompt
}, f, ensure_ascii=False, indent=2)
# 使用缓存
cache = ImageDescriptionCache()
# 在 describe 函数中
cached = cache.get(file_path, MODEL_ID, prompt)
if cached:
logger.info(f"使用缓存结果: {file_path}")
return cached
# 调用 API
result = call_doubao_vision_api(...)
# 保存到缓存
cache.set(file_path, MODEL_ID, prompt, result)
```
**预期改进**:
- 重复图片无需重新调用 API
- 响应时间从 20-30秒 降低到 <1秒
- 减少 API 调用成本
---
### 4. 使用多线程/异步处理 ⭐⭐
**当前**: 单线程顺序处理
**优化**: 使用异步并发处理
```python
import asyncio
async def describe_multiple_images(image_paths: list[str]) -> list[str]:
"""并发描述多张图片"""
tasks = [describe(path) for path in image_paths]
results = await asyncio.gather(*tasks)
return results
# 3张图片从 60-90秒 降低到 20-30秒
```
---
### 5. 优化 iFlow 提示词 ⭐
**减少输入 Token**:
```
之前: "请使用 doubao-image-mcp 的 describe_image_from_file 工具描述这张图片:D:/download/下载.jpg"
Token: ~30
优化: "描述: D:/download/下载.jpg"
Token: ~5
```
**创建 iFlow 命令别名**:
```markdown
# ~/.iflow/commands/desc.md
---
name: desc
description: 快速描述图片
---
描述图片: {input}
自动调用 doubao-image-mcp 的 describe 工具
```
使用:
```
desc D:/download/下载.jpg
```
---
### 6. 添加进度反馈 ⭐
**当前问题**: 用户不知道进度,体验差
**优化方案**:
```python
@mcp.tool()
async def describe_with_progress(image_input: str, prompt: str = "...") -> str:
"""带进度反馈的图片描述"""
steps = [
"正在读取图片...",
"正在编码为 Base64...",
"正在调用豆包 API...",
"正在生成描述...",
"完成!"
]
# 步骤 1
logger.info(f"[1/4] {steps[0]}")
yield f"[进度] {steps[0]}"
# ... 处理图片 ...
# 步骤 2
logger.info(f"[2/4] {steps[1]}")
yield f"[进度] {steps[1]}"
# ... 调用 API ...
return result
```
---
### 7. 调整豆包模型选择 ⭐
**当前模型**: `doubao-seed-1-6-251015`
**可选方案**:
- 使用更快的模型(如果有 lite 版本)
- 调整 API 参数(降低温度、减少采样等)
- 使用更简短的提示词
---
## 📈 预期性能改进
| 优化项 | 当前时间 | 优化后时间 | 改进 |
|-------|---------|-----------|------|
| 图片编码 | ~5-10秒 | ~1-2秒 | 70-80% ↓ |
| API 调用 | ~15-20秒 | ~10-15秒 | 25-33% ↓ |
| 缓存命中 | ~20-30秒 | ~0.1秒 | 99% ↓ |
| **总体(单次)** | **~23秒** | **~12秒** | **48% ↓** |
| **总体(有缓存)** | **~23秒** | **~0.1秒** | **99.5% ↓** |
---
## 🎯 立即可实施的改进
### 优先级 1: 添加图片大小限制(最快)⭐⭐⭐
```python
# 在 server.py 中添加
MAX_FILE_SIZE = 10 * 1024 * 1024 # 10MB
def check_file_size(file_path: str) -> tuple[bool, str]:
size = Path(file_path).stat().st_size
if size > MAX_FILE_SIZE:
return False, f"文件过大 ({size/1024/1024:.1f}MB),最大支持 10MB"
return True, ""
```
### 优先级 2: 简化提示词(无需改代码)⭐⭐⭐
在 iFlow 中使用更简短的命令:
```
# 之前 (30 tokens)
请使用 doubao-image-mcp 的 describe 工具描述这张图片:D:/download/下载.jpg
# 现在 (8 tokens)
描述: D:/download/下载.jpg
```
### 优先级 3: 添加缓存(中等开发量)⭐⭐
实施上述缓存机制,可大幅提升重复访问的速度。
### 优先级 4: 图片优化(高开发量)⭐⭐
实施图片压缩和格式转换,减少传输时间。
---
## 📋 总结
### 主要瓶颈
1. **工具时间过长**: 45.8秒 / 2次调用 = 22.9秒/次
- 图片编码耗时
- API 响应慢
- 可能包含大量等待时间
2. **非活动时间过长**: 755秒 (12.6分钟)
- 主要是用户交互时间
- 可以通过简化命令减少
### 快速改进方案
1. ✅ **使用简短命令**: `描述: 图片路径`
2. ✅ **限制文件大小**: 拒绝 >10MB 的文件
3. ✅ **添加缓存**: 相同图片无需重新调用
4. ✅ **图片预处理**: 压缩大图片
### 预期效果
实施所有优化后:
- **首次调用**: 23秒 → 12秒 (**48% 改进**)
- **缓存命中**: 23秒 → 0.1秒 (**99.5% 改进**)
- **用户体验**: 显著提升
---
**生成时间**: 2026-02-02
**MCP 版本**: 1.0
**模型**: doubao-seed-1-6-251015