Почему диапазон повторного использования Dagger медленнее, чем Singleton?

Я всегда думал, что при работе с Dagger2 мы должны использовать @Reusable scope вместо @Singleton если нам не нужна гарантия, чтобы получить тот же самый экземпляр, так как @Singleton использовал двойную проверку, что дорого и медленно. ..

Тем не менее, я сделал простые тесты производительности, и вот результаты:

 Reusable 4474 ms Singleton 3603 ms 

Вот код:

 @Singleton @Component interface AppComponent { fun getReusable(): ReusableFoo fun getSingleton(): SingletonFoo } @Reusable class ReusableFoo @Inject constructor() @Singleton class SingletonFoo @Inject constructor() class TestClass { @Test fun test() { val component = DaggerAppComponent.builder().build() measure { component.getReusable() } measure { component.getSingleton() } } private fun measure(block: () -> Unit) { val start = System.currentTimeMillis() (0..1000000000).forEach { block() } println(System.currentTimeMillis() - start) } } 

Такое же явление при построении более тяжелого класса (я пробовал с помощью Retrofit ) и с аннотированными методами @Provide вместо @Provide конструктора.

Я допустил ошибку в своем тесте или просто @Reusable работает медленнее? Если да, то где мы должны его использовать? Имеет ли он преимущества над @Singleton ?

    Intereting Posts