From f3dcf527e611604df6474ef0b8b2b857628bfaac Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 11 Aug 2026 16:17:19 +0900 Subject: [PATCH 1/2] perf: reuse file-name comparator --- src/main/kotlin/html4tree/main.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/html4tree/main.kt b/src/main/kotlin/html4tree/main.kt index 4daada9..f216498 100644 --- a/src/main/kotlin/html4tree/main.kt +++ b/src/main/kotlin/html4tree/main.kt @@ -94,6 +94,7 @@ li + li { """.trimIndent() private val STYLE_HASH = "sha256-" + Base64.getEncoder().encodeToString(MessageDigest.getInstance("SHA-256").digest(CSS_CONTENT.toByteArray(Charsets.UTF_8))) +private val FILE_NAME_COMPARATOR = compareBy { it.name } class Html4tree : CliktCommand() { val maxLevel:Int by option(help="Number of levels deep for which to generate an index.html file", hidden = false).int().default(-1) @@ -404,7 +405,7 @@ fun process_dir(curr_dir: File, excludeSet: Set? = null, dirFiles: Array val filesList = dirFiles ?: curr_dir.listFiles() val dir_files: MutableList = filesList?.toMutableList() ?: mutableListOf() - dir_files.sortWith(compareBy ({it.name}) ) + dir_files.sortWith(FILE_NAME_COMPARATOR) dir_files.forEach { val fileName = it.getName() // ⚡ Bolt Performance Optimization: Short-circuit string match before expensive OS filesystem calls From 051036c2b6889133197fc5570bd9b89661d96b5a Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 11 Aug 2026 16:17:38 +0900 Subject: [PATCH 2/2] docs: record comparator reuse boundary --- .jules/bolt.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.jules/bolt.md b/.jules/bolt.md index ff82bb8..af2bfbf 100644 --- a/.jules/bolt.md +++ b/.jules/bolt.md @@ -50,3 +50,7 @@ ## 2026-08-09 - 반복 호출되는 함수 내 정적 리스트 최적화 **Learning:** 디렉토리를 탐색할 때마다 호출되는 함수(process_ignore_file) 내부에서 listOf()로 고정된 리스트를 할당하면 불필요한 메모리 할당과 GC 부하가 발생합니다. **Action:** 정적인 컬렉션은 private object로 추출하고 @JvmField 등을 활용하여 단 한 번만 초기화되도록 최적화해야 합니다. + +## 2026-08-11 - Comparator 객체 재사용 +**학습:** 반복 호출되는 디렉터리 정렬 경계에서 `compareBy { it.name }`를 매번 만들 필요는 없습니다. 정렬 의미가 상태와 무관하면 하나의 불변 비교자를 재사용할 수 있습니다. +**조치:** 파일명 비교자를 최상위 `private val`로 한 번 생성하고 `process_dir`의 정렬에서 재사용합니다. 정렬 순서와 파일 시스템 경계는 변경하지 않습니다.