Sto scrivendo un'applicazione web Java EE 6 e noto un impatto significativo sulle prestazioni quando si utilizza un oggetto iniettato rispetto alla creazione e all'utilizzo diretto dell'oggetto. L'overhead sembra essere dell'ordine di 50 - 60 ms per chiamata di metodo.Impatto delle prestazioni dell'utilizzo di CDI
Ad esempio, l'utilizzo di 150 chiamate di metodo non iniettate richiede circa 500ms mentre l'oggetto iniettato utilizza 150 chiamate di metodo da 12.000 a 13.000 ms. Una differenza di ordine di grandezza e poi alcuni.
È normale?
Sono in esecuzione su JBoss AS 7.1.1 final che utilizza Weld per gestire CDI.
L'oggetto inserito è definito come un bean singleton (tramite l'annotazione javax.ejb.Singleton). Questo potrebbe causare parte del problema? O è solo il proxy di saldatura a causare il rallentamento?
Se ti interessa così tanto le prestazioni, sei * * * avvitato usando Java EE per cominciare. Dubito seriamente che gli intercettori proxy saranno il collo di bottiglia del codice. Detto questo, ciò che farei è inserire un punto di interruzione nel debugger all'interno della chiamata al metodo intercettato per vedere quanti livelli di proxy deve passare: è possibile che si verifichi un problema di configurazione che causa l'applicazione di una quantità eccessiva di tali proxy . – millimoose
La modifica dell'oggetto iniettato da ApplicationScoped anziché @Singleton ha accelerato le cose di un ordine di grandezza. Non ho idea del perché e sarei interessato se qualcuno avesse qualche feedback su questo. – Troup
Questo è ... strano.Continuerò a sondarlo nel debugger per vedere qual è la differenza nelle catene di chiamata. Altrimenti siamo bloccati a indovinare la causa di un sintomo vago. In generale, credo che la causa di questo sovraccarico si veda * dovrebbe * essere AOP, ma è una supposizione più che altro. – millimoose