From ef9f9267dd24c93bd2c9b3f0b1426170aa2ad158 Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Sun, 12 Jul 2026 03:30:34 +0000 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=20Bolt:=20=ED=8C=A8=ED=84=B4=20?= =?UTF-8?q?=EB=A7=A4=EC=B9=AD=20=EC=A1=B0=EA=B8=B0=20=EC=A2=85=EB=A3=8C=20?= =?UTF-8?q?(Short-circuit)=EB=A1=9C=20=EC=84=B1=EB=8A=A5=20=EC=B5=9C?= =?UTF-8?q?=EC=A0=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 불필요한 O(N * M) 정규식 매칭을 방지하기 위해 `process_ignore_file` 내부의 `ignored_matchers.forEach` 루프를 일반 `for` 루프와 `break`로 교체하여 조기 종료(Short-circuit)를 구현했습니다. --- .jules/bolt.md | 5 +++++ src/main/kotlin/html4tree/main.kt | 7 ++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.jules/bolt.md b/.jules/bolt.md index 8f7033f..3b1d19e 100644 --- a/.jules/bolt.md +++ b/.jules/bolt.md @@ -18,6 +18,11 @@ **학습:** Kotlin/Java에서 `java.nio.file.Files`를 통해 파일 속성 (예: `isDirectory` 또는 `isSymbolicLink`)을 확인하려면 `Path` 객체를 할당해야 하며 비싼 네이티브 OS stat 호출을 수행합니다. 파일 목록을 처리할 때 파일 시스템을 건드리는 메서드를 호출하기 전에 제외 목록 (저렴한 메모리 내 문자열 연산 사용)과 비교하여 파일 시스템 검사를 단축합니다. **조치:** `Files.isDirectory` 및 `Files.isSymbolicLink`를 호출하기 전에 `exclude` 세트를 확인하도록 조건문을 재배열했습니다. + +## 2026-07-12 - 이중 루프 내 패턴 매칭 조기 종료 (Short-Circuit) +**학습:** 무시할 파일(ignore patterns)을 확인할 때, 각 파일에 대해 모든 패턴을 순회(`forEach`)하는 것은 비효율적입니다. 파일이 하나의 패턴에 매칭되어 제외 목록에 추가되면 나머지 패턴을 확인할 필요가 없습니다. 이를 조기 종료(Short-circuit)하지 않으면 불필요한 O(N * M) 정규식/패턴 매칭 평가가 발생합니다. +**조치:** 무시 목록 평가 등 조건을 만족할 때 더 이상 확인이 필요 없는 경우에는 `forEach` 대신 일반 `for` 루프와 `break`를 사용하거나 `any`를 활용하여 연산을 단축합니다. + ## 2024-07-28 - 디렉토리 목록 불필요한 정렬 오버헤드 **학습:** 디렉토리 목록(`list()` 또는 `listFiles()`)을 단순히 필터링하여 `Set`에 추가하는 경우처럼 특정 순서가 필요하지 않은 작업에서 `.sorted()`를 호출하면 불필요한 O(N log N) 오버헤드가 발생합니다. **조치:** `Set`과 같은 순서에 무관한 자료구조에 요소를 추가하기 위한 필터링 작업에서는 디렉토리 목록에서 `.sorted()` 호출을 제거하여 성능을 최적화합니다. diff --git a/src/main/kotlin/html4tree/main.kt b/src/main/kotlin/html4tree/main.kt index ed20c50..ababa42 100644 --- a/src/main/kotlin/html4tree/main.kt +++ b/src/main/kotlin/html4tree/main.kt @@ -142,11 +142,12 @@ fun process_ignore_file(curr_dir: File): Set { curr_dir.list()?.forEach { val current = it val pathCurrent = java.nio.file.Paths.get(current) - ignored_matchers.forEach { matcher -> - if(matcher.matches(pathCurrent)){ + for (matcher in ignored_matchers) { + if (matcher.matches(pathCurrent)) { files_to_exclude.add(current) + break } - } + } } }