热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么Dagger的可重用范围比Singleton慢?

如何解决《为什么Dagger的可重用范围比Singleton慢?》经验,为你挑选了1个好方法。

我一直认为,在使用Dagger2时,我们应该使用@Reusable范围,而不是@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注释的方法而不是构造函数注入时,存在相同的现象。

我在测试中犯了错还是@Reusable慢了?如果是这样,我们应该在哪里使用它?有什么好处@Singleton吗?



1> Jeff Bowman ..:

正如David Medenjak在评论中提到并链接的那样,JVM中的微基准测试很难正确。即使将您的结果看成是面值,在一个十亿次调用的内部循环中,这些调用的平均结果平均在1ns之内,彼此之间的比例为20%。

尽管我已经写了一个单独的SO答案,其中包含更多详细信息,但我可以解决您的“它有没有好处”的问题:

    主要的性能优势@Reusable在多线程应用程序中进行构造时,因为在竞争情况下,可能@Reusable会为单独的线程创建单独的对象,而不是同步创建。支付了创建成本后(就像您在每个块的第一次调用中所做的那样),接下来的十亿个调用是免费的(或接近免费),尤其是使用JVM内联和缓存时,并且在同一线程的同一堆栈中。尽管您的基准测试没有揭示它,但是如果绑定的创建有任何线程争用,您仍然可能会看到更好的性能。@Reusable

    内存的主要优势@Reusable是可重用实例保存在直接使用它的最窄组件中。如果您有一个Android Fragment组件作为@Reusable绑定的唯一使用者,那么当您销毁Fragment并收集其Component时,Android将释放并回收该内存。

    Dagger的主要可用性优势@Reusable在于,与@Singleton自定义范围不同,@Reusable绑定可以包含在任何组件中,而不管该组件上有多少个范围注释。如果您有@Singleton绑定,则绝对需要将绑定安装在带有注释的组件中@Singleton

    主要开发人员使用的优势@Reusable在于,不像注释绑定@Singleton或者@ActivityScoped,您声明结合是无状态的或以其他方式必须是@Singleton。如果要在Dagger之外使用绑定(或者有一天要替换Dagger),则需要记录或确定@Singleton绑定是否必要,@Singleton或者仅仅是一个优化机会。随着@Reusable这种歧义消失。


推荐阅读
  • 子类从父类继承所有的成员(字段,方法,嵌套类),构造方法不属于成员,所有子类不能继承,但是子类可以调用父类的构造方法对于private方法和属性,子类一定是继承了的,但是没有访问权 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • C#设计模式之八装饰模式(Decorator Pattern)【结构型】
    一、引言今天我们要讲【结构型】设计模式的第三个模式,该模式是【装饰模式】,英文名称:DecoratorPattern。我第一次看到这个名称想到的是另外一个词语“装修”,我就说说我对“装修”的理 ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • 微信公众号:内核小王子关注可了解更多关于数据库,JVM内核相关的知识;如果你有任何疑问也可以加我pigpdong[^1]jvm一行代码是怎么运行的首先,java代码会被编译成字 ... [详细]
  • 在最近的一系列文章,对midipadAPP,有一个关于一个radialgradiant渲染每个padview利用的探讨,对审美的原因&#x ... [详细]
  • 开发笔记:Dagger2 探索记3——两大进阶组件
        今天要讲的时@Scope这个组件。为什么说它是进阶组件,就是因为它基本上没作用,但在理解了基本组件之后又必须用到。 ... [详细]
  • 1.在gradle中添加依赖在主项目的build.gradle中添加Dagger2库的依赖dependencies{compilecom.google.dagger:dagger: ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • Java面试题系列:将面试题中比较经典和核心的内容写成系列文章持续在公众号更新,可巩固基础知识,可梳理底层原理,欢迎大家持续关注【程序新视界】。本篇为面试题系列第2篇。常见面试问 ... [详细]
  • QuadTilingTimeLimit:1000MSMemoryLimit:65536KTotalSubmissions:5008Accepted:2269DescriptionT ... [详细]
author-avatar
hi347
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有