Files
xyzw_web_helper/MD说明文件夹/性能优化总结v3.13.5.md
2025-10-17 20:56:50 +08:00

8.7 KiB
Raw Permalink Blame History

性能优化总结 v3.13.5

📊 优化概述

本次优化针对用户提出的"900+ token 任务性能和内存问题"进行了全面的检查和优化。


已完成的优化

1. 内存清理机制优化

1.1 taskProgress 清理

优化内容:

  • 添加定期清理机制每5分钟清理一次完成的任务进度
  • 添加强制清理功能(批量任务结束时立即清理)
  • 新增增量清理每完成100个token立即清理避免内存累积

实施位置:

  • src/stores/batchTaskStore.js
    • cleanupCompletedTaskProgress() - 定期清理函数
    • 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
  • 使用 pendingUIUpdates Map 批量更新
  • 减少 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 更新节流有效
  • 虚拟滚动减少渲染压力

稳定性:🟢

  • 错误处理完善
  • 资源清理机制健全
  • 无已知内存泄漏点

💡 使用建议

最佳实践

  1. 关闭开发者工具

    • 开发者工具会显著增加内存占用
    • 生产环境使用时建议关闭
  2. 合理配置并发数

    • 连接池大小20默认
    • 同时执行数5默认
    • 根据服务器性能调整
  3. 启用定期清理

    • 定期清理定时器会自动启动
    • 每5分钟清理一次完成的进度
  4. 关闭批量日志

    • ENABLE_BATCH_LOGS = false(已默认关闭)
    • 减少内存占用和性能开销

监控指标

建议监控以下指标:

  • 浏览器内存使用量
  • 任务执行成功率
  • WebSocket 连接数
  • localStorage 使用量

📝 后续优化建议

可选优化(当前性能已可接受)

  1. 使用 shallowRef

    // 当前: const taskProgress = ref({})
    // 可改为: const taskProgress = shallowRef({})
    // 效果: 减少深度响应式追踪
    
  2. 使用 v-memo 指令

    <!-- 缓存组件渲染结果 -->
    <TaskProgressCard v-memo="[token.status, token.progress]" />
    
  3. 考虑 Web Worker

    • 对于超大规模任务(>2000个token
    • 可将数据处理移到 Worker 线程

🔗 相关文档


📌 版本信息

  • 版本号: v3.13.5
  • 优化类型: 性能优化 + 内存泄漏修复
  • 优先级: 🔴
  • 状态: 已完成
  • 测试建议: 900+ tokens 批量任务测试