我知道dagger通过生成代码在编译时创建注入,因此它的性能优于Guice,后者在运行时可以做到。但是特别是对于lambda的情况,我在很多地方都提到Dagger是首选。是因为冷启动问题吗?
由于lambda中存在冷启动问题,因此lambda会在长时间后收到请求时多次执行自举。那么,使用匕首,与Guice相比,自举会更快,因为它已经有了生成的代码?我说的是,与延迟加载相比,Guice中的所有对象是否也在引导过程中创建。
答案 0 :(得分:3)
您已经知道,在任何时候,任何依赖项注入框架都需要为应用程序所需的对象构建某种依赖关系图。构建此图通常是DI框架中计算上最昂贵的部分。
Guise通过在运行时使用反射来弄清楚该图。 Dagger会在编译时生成表示依赖关系图的代码。我不知道哪一个更快,但是我知道使用反射会带来不小的性能损失。
但是,最大的区别是Dagger在编译时完成了所有繁重的工作(这意味着您需要执行一次工作,无论您运行了多少次),而Guice每次应用程序启动时都必须执行等效的工作起来
现在,要回答您的问题,如果您的应用程序频繁启动和停止,则首选Dagger。对于移动应用程序而言,较慢的启动时间通常只会降低UX的性能。使用Lambda不仅会减慢冷启动时间,而且由于您需要为代码的运行时间付费,因此不断重建依赖关系图实际上会花费您更多的钱。
TLDR; (对于冷启动时间和成本而言)Dagger在Lambda上是首选,因为它移动了DI框架中最昂贵的部分来编译时间,而不是在运行时执行。