sky’s 雑記

主にAndroidとサーバーサイドの技術について記事を書きます

KoinとDagger2のパフォーマンスについて その1

唯一Koinが優位に立っていたと思っていたラーニングコストについてもDagger Hiltがリリースされ消え去ろうとしていますが,引き続きKoin利用勢としてDIライブラリの仕組みについて見ていこうと思います.

導入

以下のライブラリでKoinとDagger2の速度について比較されていた件で改めてDagger2の仕組みを調べることにしました.

GitHub - Sloy/android-dependency-injection-performance: Measure the performance of several Dependency Injection frameworks in different devices

実行環境

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'

f:id:iwsksky:20200624012107p:plain

図1. エミュレータでの実行結果

setupに比べるとinjectのパフォーマンスは大きな差は見られない.これについて今の段階では以下のように考察しているがもう少し詳しく知りたいというのが今回の記事の趣旨です.(※ KoinとDagger2のみの比較になります)

Koin

Koinはランタイムでヒープに確保されたインスタンスの参照が必要 f:id:iwsksky:20200624010509p:plain 図2. MemoryProfiler->BeanDefinition

setup

setupについては以前の記事でも紹介したとおり生成したmoduleをBeanRegistoryのdifinitionsにsetするのが処理の実体となる.moduleの数が増えればそれだけsetupに必要な時間は長くなるはず. koinのインスタンス管理について - sky’s 雑記

inject

injectはsetupで登録したmoduleを参照する処理でありヒープ領域へのアクセスを行う.

Dagger2

Dagger2はannotation processorによりクラスをgenerateする,dexレベルで依存性が解決される. f:id:iwsksky:20200624012941p:plain 図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のコードジェネレートの部分を詳しくみたいと思う.以上.