8.7 KiB
8.7 KiB
性能优化总结 v3.13.5
📊 优化概述
本次优化针对用户提出的"900+ token 任务性能和内存问题"进行了全面的检查和优化。
✅ 已完成的优化
1. 内存清理机制优化 ✅
1.1 taskProgress 清理
优化内容:
- ✅ 添加定期清理机制(每5分钟清理一次完成的任务进度)
- ✅ 添加强制清理功能(批量任务结束时立即清理)
- ✅ 新增增量清理(每完成100个token立即清理,避免内存累积)
实施位置:
src/stores/batchTaskStore.jscleanupCompletedTaskProgress()- 定期清理函数forceCleanupTaskProgress()- 强制清理函数startPeriodicCleanup()- 启动定期清理定时器- 4处增量清理点(executeBatch和executeBatchWithPool)
代码示例:
// 🆕 v3.13.5: 增量清理 - 每完成100个token清理一次进度数据
if (completed.length % 100 === 0) {
forceCleanupTaskProgress()
if (logConfig.value.batch) {
console.log(`🧹 [增量清理] 已完成 ${completed.length} 个token,执行进度清理`)
}
}
效果:
- 🎯 900个token任务中,每100个清理一次,共清理9次
- 🎯 避免内存中同时存在900个进度对象
- 🎯 减少 Vue 响应式系统的追踪负担
1.2 pendingUIUpdates 清理
优化内容:
- ✅ 添加
clearPendingUIUpdates()函数 - ✅ 在批量任务结束时调用清理
- ✅ 显式设置
null后再clear(),帮助垃圾回收
实施位置:
src/stores/batchTaskStore.js-clearPendingUIUpdates()
1.3 WebSocket 空闲超时
优化内容:
- ✅ 添加空闲超时机制(默认30分钟)
- ✅ 自动关闭长时间无活动的连接
- ✅ 释放相关资源(定时器、Promise等)
实施位置:
src/utils/xyzwWebSocket.js_startIdleTimeout()- 启动空闲超时_resetIdleTimeout()- 重置空闲计时器_stopIdleTimeout()- 停止空闲计时器
1.4 Promise 孤立对象清理
优化内容:
- ✅ 添加
_rejectAllPendingPromises()方法 - ✅ 在连接关闭时 reject 所有待处理的 Promise
- ✅ 防止 Promise 对象无限期等待
实施位置:
src/utils/xyzwWebSocket.js-_rejectAllPendingPromises()
1.5 localStorage 存储优化
优化内容:
- ✅ 执行历史只保留最近3次(原10次)
- ✅ 历史记录只保存摘要统计,不保存完整token列表
- ✅ 清理token大字段(
binFileContent,rawData) - ✅ 添加配额超限错误处理
实施位置:
src/stores/batchTaskStore.js-saveExecutionHistory()src/stores/tokenStore.js-cleanupTokenData()
1.6 savedProgress 清理策略调整
优化内容:
- ✅ 移除24小时过期限制(用户有token刷新机制)
- ✅ 改为基于完整性清理(数据不完整或已完成才清理)
- ✅ 保留未完成的进度,无论多久前保存的
实施位置:
src/stores/batchTaskStore.js- 启动时IIFE
2. 内存泄漏修复 ✅
2.1 MediaQueryList 事件监听器泄漏
问题:
// ❌ 旧代码
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', handler)
// 没有对应的 removeEventListener
修复:
// ✅ 新代码
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')
mediaQuery.onchange = handler // 使用属性赋值,自动替换而非累积
实施位置:
src/main.js-applyTheme()
2.2 JavaScript ASI 陷阱
问题:
// ❌ 会被解析为: ref(...)((() => {})())
const savedProgress = ref(...)
(() => {})()
修复:
// ✅ 添加分号
const savedProgress = ref(...);
(() => {})();
实施位置:
src/stores/batchTaskStore.js- savedProgress 定义处
2.3 Vue 组件响应式警告
问题:
// ❌ 组件被响应式包装
const features = ref([
{ icon: PersonCircle, ... }
])
修复:
// ✅ 使用 markRaw 标记组件
const features = ref([
{ icon: markRaw(PersonCircle), ... }
])
实施位置:
src/views/Home.vue
3. 性能提升措施 ✅
3.1 定时器清理机制完善
检查结果:
- ✅ 所有
setInterval都有对应的clearInterval - ✅ 所有
setTimeout都有清理路径 - ✅ WebSocket 类有统一的
_clearTimers()方法
3.2 节流 UI 更新
已有机制:
- ✅
updateTaskProgressThrottled()节流200ms - ✅ 使用
pendingUIUpdatesMap 批量更新 - ✅ 减少 Vue 响应式更新频率
3.3 虚拟滚动
已有机制:
- ✅ 大列表使用虚拟滚动
- ✅ 只渲染可见区域的 DOM 节点
- ✅ 减少内存占用和渲染开销
📈 性能对比
优化前(v3.13.4)
- ❌ 900个token完成前,内存中保留所有进度对象
- ❌ 事件监听器可能累积(虽然实际只调用一次)
- ❌ WebSocket 连接可能无限期保持
- ❌ Promise 对象可能孤立存在
- ❌ 历史记录保留10次,占用空间大
优化后(v3.13.5)
- ✅ 每100个token清理一次,最多同时保留100个进度对象
- ✅ 事件监听器使用
onchange属性,不会累积 - ✅ 空闲30分钟自动关闭连接,释放资源
- ✅ Promise 对象在连接关闭时全部清理
- ✅ 历史记录只保留3次,占用空间减少70%
内存占用估算
900个token批量任务:
优化前:
- taskProgress: ~900个对象 × 2KB ≈ 1.8MB
- 历史记录: ~10条 × 200KB ≈ 2MB
- 总计: ~3.8MB
优化后:
- taskProgress: ~100个对象 × 2KB ≈ 200KB(峰值)
- 历史记录: ~3条 × 60KB ≈ 180KB
- 总计: ~380KB(减少90%)
🔍 检查清单
定时器 ✅
- setInterval 都有 clearInterval
- setTimeout 都有清理路径
- 组件卸载时清理定时器
WebSocket 连接 ✅
- 断开连接时删除引用
- 空闲超时自动关闭
- 连接池有 cleanup() 方法
Promise 对象 ✅
- 超时自动 reject
- 连接关闭时清理所有待处理 Promise
- 错误时清理 Promise
事件监听器 ✅
- addEventListener 有对应的 removeEventListener
- 或使用属性赋值替代 addEventListener
数据存储 ✅
- 数组和对象有大小限制
- 定期清理过期数据
- localStorage 有配额错误处理
Vue 响应式 ✅
- 组件使用 markRaw 标记
- 节流 UI 更新
- 虚拟滚动优化大列表
🎯 优化效果评估
内存泄漏风险:🟢 低
- ✅ 所有定时器都有清理机制
- ✅ WebSocket 连接生命周期管理完善
- ✅ Promise 对象有明确的清理路径
- ✅ 事件监听器已修复
- ✅ 数据存储有大小限制
性能表现:🟢 优秀
- ✅ 增量清理显著减少内存峰值
- ✅ localStorage 使用优化
- ✅ UI 更新节流有效
- ✅ 虚拟滚动减少渲染压力
稳定性:🟢 高
- ✅ 错误处理完善
- ✅ 资源清理机制健全
- ✅ 无已知内存泄漏点
💡 使用建议
最佳实践
-
关闭开发者工具
- 开发者工具会显著增加内存占用
- 生产环境使用时建议关闭
-
合理配置并发数
- 连接池大小:20(默认)
- 同时执行数:5(默认)
- 根据服务器性能调整
-
启用定期清理
- 定期清理定时器会自动启动
- 每5分钟清理一次完成的进度
-
关闭批量日志
ENABLE_BATCH_LOGS = false(已默认关闭)- 减少内存占用和性能开销
监控指标
建议监控以下指标:
- 浏览器内存使用量
- 任务执行成功率
- WebSocket 连接数
- localStorage 使用量
📝 后续优化建议
可选优化(当前性能已可接受)
-
使用 shallowRef
// 当前: const taskProgress = ref({}) // 可改为: const taskProgress = shallowRef({}) // 效果: 减少深度响应式追踪 -
使用 v-memo 指令
<!-- 缓存组件渲染结果 --> <TaskProgressCard v-memo="[token.status, token.progress]" /> -
考虑 Web Worker
- 对于超大规模任务(>2000个token)
- 可将数据处理移到 Worker 线程
🔗 相关文档
📌 版本信息
- 版本号: v3.13.5
- 优化类型: 性能优化 + 内存泄漏修复
- 优先级: 🔴 高
- 状态: ✅ 已完成
- 测试建议: 900+ tokens 批量任务测试