diff --git a/.jules/bolt.md b/.jules/bolt.md index 39f32f6e..9dd0df94 100644 --- a/.jules/bolt.md +++ b/.jules/bolt.md @@ -1,3 +1,7 @@ ## 2024-06-21 - Regex Compilation in Loops **Learning:** In Kotlin, compiling regular expressions (`.toRegex()`) inside a loop over files is a significant O(N * M) performance bottleneck when processing ignore files (N files * M rules). **Action:** Always map string rules to compiled `Regex` objects outside of the file iteration loop (O(M) compilation) to avoid unnecessary regex re-compilations. + +## 2024-05-19 - String Concatenation in HTML Generation +**Learning:** Repeated `+=` concatenation while rendering directory entries copies growing strings and turns large directory output into O(N^2) work. +**Action:** Use `StringBuilder` inside the directory-entry loop and append newlines separately. diff --git a/src/main/kotlin/html4tree/main.kt b/src/main/kotlin/html4tree/main.kt index 50b2680d..291400fd 100644 --- a/src/main/kotlin/html4tree/main.kt +++ b/src/main/kotlin/html4tree/main.kt @@ -124,18 +124,19 @@ fun process_dir(curr_dir: File){ """ val index_middle = fun():String{ - var l="" + val l = StringBuilder() val dir_files: MutableList = curr_dir.listFiles()?.toMutableList() ?: mutableListOf() dir_files.sortWith(compareBy ({it.name}) ) dir_files.forEach { val isLinkedDirectory = it.isDirectory() && !java.nio.file.Files.isSymbolicLink(it.toPath()) if((it.getName() !in exclude) && (isLinkedDirectory || !it.isDirectory())) { - l += """
  • ${if (isLinkedDirectory) { "📁" } else { "▸" }} ${it.getName().escapeHtml()}
  • """+"\n" + l.append("""
  • ${if (isLinkedDirectory) { "📁" } else { "▸" }} ${it.getName().escapeHtml()}
  • """) + l.append('\n') } } - return l; + return l.toString(); } val index_bottom=""" diff --git a/src/main/kotlin/html4tree/util.kt b/src/main/kotlin/html4tree/util.kt index 9a882d74..c8979c31 100644 --- a/src/main/kotlin/html4tree/util.kt +++ b/src/main/kotlin/html4tree/util.kt @@ -39,7 +39,7 @@ class LinkedList { if(l == null){ return null } else { - l.next = null + l.next = null return LinkedListEntry(l.data, l.level) } }