为什么 dagger 被认为比 Guice 更适合 AWS lambda 实施?

Why is dagger considered better for AWS lambda implementation than Guice?

我知道 dagger 通过生成代码在编译时创建注入,因此它的性能优于在运行时执行的 Guice。但特别是对于 lambda 的情况,我看到它在多个地方提到 Dagger 是首选。是因为冷启动问题吗?

由于 lambda 的冷启动问题,lambda 在很长时间后每次收到请求时都会多次 bootstrapping。那么,与匕首相比,bootstrapping 会比 Guice 快得多,因为它已经有了生成的代码?我是说与延迟加载相比,Guice 中的所有对象是否也在 bootstrap 期间创建。

如您所知,任何依赖注入框架在某些时候都需要为您的应用程序所需的对象构建某种依赖关系图。构建此图通常是 DI 框架中计算量最大的部分。

Guice 在 运行 时使用反射计算出这张图。 Dagger 在编译时生成表示依赖图的代码。我不知道哪个更快,但我知道使用反射会导致 non-trivial 性能下降。

然而,最大的区别是 Dagger 在编译时完成所有繁重的工作(这意味着您只需完成一次工作,无论您 运行 它执行多少次),而 Guice 必须完成等效的工作每次应用程序启动时工作。

现在,回答您的问题,如果您的应用程序频繁启动和停止,则首选 Dagger。对于移动应用程序之类的东西,较慢的启动时间主要只会降低用户体验。使用 Lambda,它不仅会减慢冷启动时间,而且由于您需要为代码 运行ning 的时间付费,因此不断重建依赖关系图实际上会花费您更多的钱。

TLDR; Dagger 在 Lambda 上是首选(冷启动时间和成本),因为它将 DI 框架中最昂贵的部分转移到编译时而不是执行它在 运行 时间。