From 94f4307783ea5c64bed4c174239d71b6ef54b644 Mon Sep 17 00:00:00 2001 From: shenmo Date: Sun, 29 Mar 2026 16:36:58 +0800 Subject: [PATCH] =?UTF-8?q?perf(=E5=AE=89=E8=A3=85=E6=97=A5=E5=BF=97):=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=AE=89=E8=A3=85=E6=97=A5=E5=BF=97=E5=A4=84?= =?UTF-8?q?=E7=90=86=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加日志缓冲和批量发送机制以减少IPC通信次数 限制前端日志条目数量防止内存泄漏 --- electron/main/backend/install-manager.ts | 26 ++++++++++++++++++++++-- src/modules/processInstall.ts | 8 +++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/electron/main/backend/install-manager.ts b/electron/main/backend/install-manager.ts index e0fcc8a3..5e7fe784 100644 --- a/electron/main/backend/install-manager.ts +++ b/electron/main/backend/install-manager.ts @@ -561,20 +561,42 @@ async function processNextInQueue() { let stdout = ""; let stderr = ""; + let logBuffer = ""; + let logBufferTimer: NodeJS.Timeout | null = null; + const LOG_FLUSH_MS = 100; + + const flushLogBuffer = () => { + if (logBuffer.length > 0) { + sendLog(logBuffer); + logBuffer = ""; + } + logBufferTimer = null; + }; + + const bufferedSendLog = (message: string) => { + logBuffer += message; + if (!logBufferTimer) { + logBufferTimer = setTimeout(flushLogBuffer, LOG_FLUSH_MS); + } + }; child.stdout.on("data", (d) => { const s = d.toString(); stdout += s; - sendLog(s); + bufferedSendLog(s); }); child.stderr.on("data", (d) => { const s = d.toString(); stderr += s; - sendLog(s); + bufferedSendLog(s); }); child.on("close", (code) => { + if (logBufferTimer) { + clearTimeout(logBufferTimer); + flushLogBuffer(); + } if (task.cancelled) { reject(new Error("安装已取消")); return; diff --git a/src/modules/processInstall.ts b/src/modules/processInstall.ts index fad143b0..7d60b1a6 100644 --- a/src/modules/processInstall.ts +++ b/src/modules/processInstall.ts @@ -183,13 +183,19 @@ window.ipcRenderer.on( }, ); +const MAX_LOG_ENTRIES = 500; + window.ipcRenderer.on("install-log", (_event, log: InstallLog) => { const downloadObj = downloads.value.find((d) => d.id === log.id); - if (downloadObj) + if (downloadObj) { downloadObj.logs.push({ time: log.time, message: log.message, }); + if (downloadObj.logs.length > MAX_LOG_ENTRIES) { + downloadObj.logs.splice(0, downloadObj.logs.length - MAX_LOG_ENTRIES); + } + } }); window.ipcRenderer.on("install-complete", (_event, log: DownloadResult) => {