Skip to content

Conversation

@arnaudgiuliani
Copy link
Member


Optimize Lazy Modules Loading with Parallel Initialization

Summary

This PR significantly improves Koin startup performance by enabling true parallel loading of lazy modules. Previously, lazy modules were loaded sequentially within a single coroutine, defeating the purpose of lazy loading. Now each lazy module loads in its own coroutine job, allowing concurrent
initialization.

This approach:

  • Blocked lazy modules from loading concurrently
  • Caused startup time to scale linearly with module count
  • Undermined the performance benefits of lazy loading

Solution

Core Fix (KoinApplicationLazyExt.kt:52-56)

Each lazy module now launches in a separate coroutine job, enabling true parallel initialization.

Added Multiplatform runBlocking Support (KoinPlatformCoroutinesTools):

  • Added runBlockingOnPlatform() to enable blocking waits on JVM & Native
  • Moved waitAllStartJobs() from JVM-only to common code
  • JS platform throws clear error directing users to use awaitAllStartJobs() instead

Key Changes

Performance Optimization:

  • core/koin-core-coroutines/src/commonMain/kotlin/org/koin/core/KoinApplicationLazyExt.kt - Parallel loading implementation
  • Each lazy module gets its own coroutine job for concurrent initialization

Multiplatform Support:

  • KoinPlatformCoroutinesTools - Added runBlockingOnPlatform() for JVM/Native
  • KoinWaitExt.kt → KoinWaitExt.jvm.kt + new common KoinWaitExt.kt
  • waitAllStartJobs() now available on all platforms (JVM/Native block, JS throws error)

Benchmarks & Testing:

  • Added lazy_modules_400.kt - 400-definition lazy module for stress testing
  • Added HeavyStartupBenchmark.kt - Benchmarks comparing regular vs lazy modules (1, 100, 1000 modules)
  • Updated existing benchmarks to test lazy module scenarios

@arnaudgiuliani arnaudgiuliani added this to the 4.2.0 milestone Nov 5, 2025
@arnaudgiuliani arnaudgiuliani merged commit aea86e6 into 4.2.0 Nov 5, 2025
3 of 4 checks passed
@arnaudgiuliani arnaudgiuliani deleted the fix_koin-core-coroutines-load branch November 5, 2025 11:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants