【发布时间】:2012-11-21 16:00:09
【问题描述】:
我正在编写一个 Java EE 6 Web 应用程序,我注意到使用注入对象与直接创建和使用对象相比,性能会受到显着影响。每个方法调用的开销似乎约为 50 - 60 毫秒。
例如,使用非注入的 150 次方法调用大约需要 500 毫秒,而使用注入的对象 150 次方法调用需要 12,000 - 13,000 毫秒。一个数量级的差异,然后是一些。
这是平常的事吗?
我在 JBoss AS 7.1.1 final 上运行,它使用 Weld 来处理 CDI。
注入的对象被定义为一个单例 bean(通过 javax.ejb.Singleton 注释)。这可能是问题的一部分吗?还是只是 Weld 代理导致速度变慢?
【问题讨论】:
-
如果您那么在意性能,那么您方式会被一开始就使用 Java EE 搞砸了。我严重怀疑代理拦截器将成为您代码中的瓶颈。也就是说,我要做的是在被拦截的方法调用内的调试器中放置一个断点,以查看它必须通过多少层代理——可能你有一些配置问题导致应用过多的代理.
-
将注入的对象更改为 ApplicationScoped 而不是 @Singleton 加快了一个数量级的速度。我不知道为什么,如果有人对此有任何反馈,我会很感兴趣。
-
您是否尝试过使用分析器来追踪消耗时间的地方?
-
javax.inject 中的 Singleton 非常没有价值。如果您需要 EJB 的所有功能,请使用 EJB 之一,否则使用 j.e.c 之一。另外,是的,Weld 和 OWB 使用代理。 AS 7.1.1 使用 Weld 1.1.5,我相信 1.1.9,也许它是 1.18,虽然它已经过时并且包括一些额外的性能改进。至于 Spring perf,Mark Struberg 发现 CDI(在 Weld 和 OWB 中)更快。
-
是的,你说得对。很抱歉造成混乱。
标签: java java-ee-6 jboss7.x cdi jboss-weld