diff --git a/.jules/bolt.md b/.jules/bolt.md new file mode 100644 index 0000000..9717895 --- /dev/null +++ b/.jules/bolt.md @@ -0,0 +1,3 @@ +## YYYY-MM-DD - Sliding Window Concurrency +**Learning:** In Swift structured concurrency, when processing high-volume tasks using `withTaskGroup`, utilize a sliding window approach with an iterator instead of static chunking. Static chunking limits throughput due to tail latency (waiting for the slowest task in a chunk), whereas a sliding window maintains maximum concurrent execution limits continuously. +**Action:** Use an iterator inside `withTaskGroup` to add tasks up to the concurrency limit, then add new tasks as previous ones complete. diff --git a/Sources/Cacheout/Memory/ProcessMemoryScanner.swift b/Sources/Cacheout/Memory/ProcessMemoryScanner.swift index 3f8e728..b987f3d 100644 --- a/Sources/Cacheout/Memory/ProcessMemoryScanner.swift +++ b/Sources/Cacheout/Memory/ProcessMemoryScanner.swift @@ -97,29 +97,35 @@ actor ProcessMemoryScanner { /// /// Returns the collected entries and the count of EPERM failures. private func scanPIDs(_ pids: [pid_t]) async -> (entries: [ProcessEntryDTO], epermCount: Int) { - // Chunk PIDs to cap concurrency at maxConcurrency. - let chunks = stride(from: 0, to: pids.count, by: maxConcurrency).map { - Array(pids[$0..