我正在编写一个Java EE 6 Web应用程序,并且我注意到在使用注入对象与直接创建和使用对象时显着的性能影响。开销似乎是每个方法调用50-60毫秒的量级。使用CDI对性能的影响
例如,使用未注入的150个方法调用大约需要500ms,而使用注入的对象150个方法调用需要12,000-13,000ms。一个数量级的差异,然后一些。
这是平常的吗?
我在JBoss AS 7.1.1 final上运行,它使用Weld来处理CDI。
注入的对象被定义为单例bean(通过javax.ejb.Singleton注释)。这是否会造成问题的一部分?或者它只是Weld代理导致减速?
如果您关心的是性能,那么您就开始使用Java EE进行操作。我严重怀疑代理拦截器会成为你的代码中的瓶颈。也就是说,我要做的是在拦截方法调用中的调试器中放置一个断点,以查看它必须经过多少层代理 - 可能会导致某些配置问题导致应用过量的代理。 – millimoose
将注入的对象更改为ApplicationScoped而不是@Singleton将事物加速了一个数量级。我不知道为什么,如果有人对此有任何反馈,我会感兴趣。 – Troup
这很奇怪。我仍然在调试器中捅了一下,看看调用链有什么不同。否则,我们坚持猜测一个模糊症状的原因。一般来说,我认为你所看到的这种开销的原因应该是AOP,但这是一个猜测。 – millimoose