From 6a72710bb6f763e172cb8eb405fdb15ebefb6454 Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Fri, 10 Jul 2026 02:19:51 +0000 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=20=EC=84=B1=EB=8A=A5=20=ED=96=A5?= =?UTF-8?q?=EC=83=81:=20deriveProgressState=20=EB=A9=94=EB=AA=A8=EB=A6=AC?= =?UTF-8?q?=20=EC=B5=9C=EC=A0=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 진척 상태 계산 시 객체를 매번 새로 생성하는 대신, 불변(frozen) 정적 상수를 캐싱하여 반환하도록 변경했습니다. 이를 통해 렌더링 루프(renderAll) 수행 시 O(N) 객체 생성에 따른 메모리 할당 및 가비지 컬렉션(GC) 부하를 제거했습니다. --- app.js | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/app.js b/app.js index a3099f66..34cc70f4 100644 --- a/app.js +++ b/app.js @@ -1209,24 +1209,31 @@ function computeTaskMetrics() { }; } +// ⚡ Bolt: Cache static progress state objects to prevent O(N) memory allocations per render loop +const PROGRESS_STATE_EMPTY = Object.freeze({ label: '', className: '' }); +const PROGRESS_STATE_DONE = Object.freeze({ label: '완료', className: 'done' }); +const PROGRESS_STATE_DELAY = Object.freeze({ label: '지연', className: 'delay' }); +const PROGRESS_STATE_ACTIVE = Object.freeze({ label: '진행', className: 'active' }); +const PROGRESS_STATE_BEFORE = Object.freeze({ label: '진행전', className: 'before' }); + function deriveProgressState(task, baseDate) { if (!task.plannedStartDate || !task.plannedEndDate) { - return { label: '', className: '' }; + return PROGRESS_STATE_EMPTY; } if (task.actualStartDate && task.actualEndDate) { - return { label: '완료', className: 'done' }; + return PROGRESS_STATE_DONE; } if (compareDateStrings(baseDate, task.plannedEndDate) >= 0 && (!task.actualStartDate || !task.actualEndDate)) { - return { label: '지연', className: 'delay' }; + return PROGRESS_STATE_DELAY; } if (task.actualStartDate && !task.actualEndDate) { - return { label: '진행', className: 'active' }; + return PROGRESS_STATE_ACTIVE; } if (compareDateStrings(baseDate, task.plannedStartDate) < 0) { - return { label: '진행전', className: 'before' }; + return PROGRESS_STATE_BEFORE; } - return { label: '진행전', className: 'before' }; + return PROGRESS_STATE_BEFORE; } function calculatePlannedProgressRatio(baseDate, startDate, endDate, durationDays) {