KoinとDagger2のパフォーマンスについて その1
唯一Koinが優位に立っていたと思っていたラーニングコストについてもDagger Hiltがリリースされ消え去ろうとしていますが,引き続きKoin利用勢としてDIライブラリの仕組みについて見ていこうと思います.
導入
以下のライブラリでKoinとDagger2の速度について比較されていた件で改めてDagger2の仕組みを調べることにしました.
実行環境
implementation "org.koin:koin-android:2.0.0-alpha-3" implementation 'com.google.dagger:dagger:2.16' kapt 'com.google.dagger:dagger-compiler:2.16'
図1. エミュレータでの実行結果
setupに比べるとinjectのパフォーマンスは大きな差は見られない.これについて今の段階では以下のように考察しているがもう少し詳しく知りたいというのが今回の記事の趣旨です.(※ KoinとDagger2のみの比較になります)
Koin
Koinはランタイムでヒープに確保されたインスタンスの参照が必要 図2. MemoryProfiler->BeanDefinition
setup
setupについては以前の記事でも紹介したとおり生成したmoduleをBeanRegistoryのdifinitionsにsetするのが処理の実体となる.moduleの数が増えればそれだけsetupに必要な時間は長くなるはず. koinのインスタンス管理について - sky’s 雑記
inject
injectはsetupで登録したmoduleを参照する処理でありヒープ領域へのアクセスを行う.
Dagger2
Dagger2はannotation processorによりクラスをgenerateする,dexレベルで依存性が解決される. 図3. classes.dex->classes-dex2jar.jar->InjectionTest_JavaDaggerTest_MembersInjector.class
setup
Dagger2の場合はsetupに必要なのはDaggerComponentのインスタンス生成のみ.依存性はdex生成時点で既に解決されているのでアプリケーション起動時のsetupに時間がかからない.
inject
injectについてはsetupで生成したcomponentが保持するinject対象のインスタンスを参照する.
※ この部分が一番不明瞭で処理レイヤーはKoinと変わらないように見えるが2倍以上速度が違う.この速度の差は実装方法に依っているというのが現在の仮説.
次回以降
ということで一番謎なのがinjectの部分ではあるのですが,せっかくなので次回はDagger2のコードジェネレートの部分を詳しくみたいと思う.以上.