Ich schreibe eine Java EE 6-Webanwendung, und ich bemerke eine erhebliche Leistungseinbußen bei der Verwendung eines injizierten Objekts im Gegensatz zu dem Erstellen und Verwenden des Objekts direkt. Der Overhead scheint in der Größenordnung von 50 bis 60 ms pro Methodenaufruf zu liegen.Leistungseinfluss der Verwendung von CDI
Zum Beispiel dauert die Verwendung nicht injizierter 150-Methodenaufrufe ca. 500 ms, während die Verwendung der Methodenaufrufe mit injizierten Objekten 150.000 - 13.000 ms benötigt. Eine Größenordnung Unterschied und dann einige.
Ist das normal?
Ich bin auf JBoss AS 7.1.1 Finale ausgeführt, die Weld verwendet, um CDI zu behandeln.
Das injizierte Objekt wird als Singleton-Bean definiert (über die Annotation javax.ejb.Singleton). Könnte dies einen Teil des Problems verursachen? Oder ist es nur der Weld-Proxy, der die Verlangsamung verursacht?
Wenn Sie über die Leistung kümmern, die viel, du bist * * Art und Weise verschraubt von Java EE mit zu beginnen. Ich bezweifle ernsthaft, dass proxied Interceptors der Flaschenhals in Ihrem Code sein werden. Das heißt, was ich tun würde, einen Haltepunkt im Debugger innerhalb des abgefangenen Methodenaufruf gesetzt wird zu sehen, wie viele Schichten von Proxies es passieren hat - es ist möglich, dass Sie einige Konfigurationsproblem haben, die eine übermäßige Menge von ihnen verursacht werden angewendet . – millimoose
Durch die Änderung des injizierten Objekts als ApplicationScoped anstelle von @Singleton wurden die Dinge um eine Größenordnung beschleunigt. Ich habe keine Ahnung warum und wäre daran interessiert, wenn irgendjemand etwas dazu sagen würde. – Troup
Das ist ... seltsam.Ich würde immer noch im Debugger herumstochern, um zu sehen, was der Unterschied in den Aufrufketten ist. Sonst müssen wir die Ursache für ein vages Symptom erraten. Im Allgemeinen glaube ich, dass die Ursache für diesen Overhead * AOP sein sollte, aber es ist mehr als alles andere. – millimoose