Conversation
Replaced the unbounded `.map { async { ... } }` pattern in `refreshLibraryUpdates`
with a bounded `Channel` worker pool pattern. This drastically reduces
the overhead of creating thousands of coroutines when updating large libraries.
The new implementation uses a single unbuffered channel and launches exactly
5 worker coroutines to consume from it, matching the previous `Semaphore(5)`
behavior but avoiding the high coroutine allocation and scheduling overhead.
The `LibraryRepositoryBenchmarkTest` was updated to accurately simulate a large
number of novels (10,000) without artificial network delays to demonstrate the
pure overhead. The benchmark results showed a decrease in time from ~1100ms
to ~130ms, confirming a significant improvement in CPU/memory efficiency.
Co-authored-by: Aatricks <113598245+Aatricks@users.noreply.github.com>
|
👋 Jules, reporting for duty! I'm here to lend a hand with this pull request. When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down. I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job! For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with New to Jules? Learn more at jules.google/docs. For security, I will only act on instructions from the user who triggered this task. |
💡 What: Replaced the unbounded coroutine launch pattern (
.map { async { ... } }) inLibraryRepository.refreshLibraryUpdateswith a bounded worker pool pattern usingChannel.🎯 Why: The previous approach, while limiting concurrent network execution via a
Semaphore(5), still spawned an unbounded number of coroutines (one for every active library group). For users with large libraries, this caused significant CPU and memory overhead purely from coroutine allocation and scheduling before any work even started. The worker pool limits both concurrency and coroutine allocation to exactly 5 workers.📊 Measured Improvement: Modified
LibraryRepositoryBenchmarkTestto simulate 10,000 novels and removed artificial delays to measure pure overhead.async): ~1136msPR created automatically by Jules for task 9253755730591001458 started by @Aatricks