Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .jules/bolt.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,6 @@
## 2025-01-24 - 단일 readAttributes 호출로 파일 속성 조회 최적화 (순회 루프)
**학습:** 디렉토리 순회 루프 내에서 isDirectory 및 isSymbolicLink 두 번의 stat을 각각 호출하면 파일 시스템 I/O 오버헤드가 배가됩니다. 메모리 내 제외 규칙 확인 후 한 번의 readAttributes로 속성을 한 번에 가져오는 것이 훨씬 빠릅니다.
**조치:** Files.isDirectory 및 Files.isSymbolicLink를 단일 Files.readAttributes 호출로 교체하여 O(N) I/O 통신을 최적화했습니다.
## 2026-08-09 - Array 초기화 시 중간 리스트 할당 제거
**학습:** Kotlin에서 `Collection.map { ... }.toTypedArray()`를 사용하면 중간에 `ArrayList`가 생성되어 불필요한 메모리 할당 및 가비지 컬렉션(GC) 오버헤드가 발생합니다. 특히 디렉토리를 순회하며 수많은 파일 목록을 처리하는 핫 패스(hot path)에서는 이러한 오버헤드가 누적되어 성능 저하를 일으킵니다.
**조치:** 중간 컬렉션 생성을 피하기 위해 `Array(size) { index -> ... }` 생성자를 사용하여 배열을 직접 초기화하도록 변경했습니다. 이를 통해 불필요한 메모리 할당을 제거하고 성능을 최적화했습니다.
2 changes: 1 addition & 1 deletion src/main/kotlin/html4tree/main.kt
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ internal fun crawl_directories(

// ⚡ Bolt Performance Optimization: 디렉토리 목록을 캐싱하여 중복된 I/O 시스템 호출을 줄임
val dirFiles = listFiles(lle.file)
val dirFilesNames = dirFiles?.map { it.name }?.toTypedArray()
val dirFilesNames = dirFiles?.let { Array(it.size) { index -> it[index].name } }
val exclude = processIgnoreFile(lle.file, dirFilesNames)

if(maxLevel == -1 || currentLevel <= maxLevel)
Expand Down
Loading