我目前有一个命令行工具,它使用Guice及其扩展程序。
完成该工具的功能后,我确定性能不合标准,并使用简单的hprof开始分析。
这已经指出仅仅创建Injector是一个重要的性能问题。我通常避免在模块中做任何实际工作,并为Providers保留计算密集型工作......
有了这个,Guice的一般性能指南是什么?我应该避免使用@AssistedInject和FactoryModuleBuilders吗?尽可能避免@Singletons?确保所有绑定都是显式的并避免JIT绑定?
我一直在搜索,但除了人们说它真的很快之外,我无法真正找到基本的Guice性能。
答案 0 :(得分:3)
首先,你的问题还有很多不足之处。什么是“低于标准”的表现,你是如何决定这意味着什么的?这是武断的吗?你有一个认为它太慢的用户吗?是否需要很长时间才能开始或长时间来产生用户交互的结果?
如果没有实际的代码来评估,很难调试性能问题。以下是我的经验提示:
仅创建一次进样器。我看到一个项目,他们正在为每个REST请求创建一个注入器,它的性能非常糟糕。当他们停止这样做时,他们的API速度提高了15倍。如果您需要通过代码创建多个注入器,我强烈建议您重构,这样您就不需要了。
单身人士可以表现出色,只是不要滥用它。它们只创建一次,这可以在您创建注射器(急切单体)时或在对象图中的其他东西首次请求它们时发生。
明白Guice是一个基于反射的库,反射总是很慢。 Guice在运行时非常快速,但在创建注入器时会以很多反射为代价(参见第1项)。如果您在应用程序中看到明显的延迟,则可能意味着您做错了。
最后,如果您认为自己无法处理Guice的性能“问题”,那么您可以尝试使用Square(版本1)和Google(版本2)中的Dagger等替代方案。它使用代码生成而不是反射,因此您没有反射成本,但它没有完整的功能,也没有扩展。