2013-04-03 12 views
5

Attualmente ho uno strumento da riga di comando che utilizza Guice e le sue estensioni in modo piuttosto pesante.Linee guida generali sulle prestazioni Guice

Dopo aver completato la funzionalità dello strumento, ho determinato che le prestazioni sono inferiori agli standard e ho iniziato la profilazione utilizzando hprof semplice.

Ciò ha evidenziato che la creazione dell'iniettore è un problema di prestazioni significativo. In genere evito di fare qualsiasi lavoro reale nei moduli e riservo il lavoro di elaborazione intensivo per i provider ...

Con questo dato, quali sono le linee guida generali sulle prestazioni per Guice? Dovrei evitare di usare @AssistedInject e FactoryModuleBuilders? Evitare @Singletons se possibile? Assicurarsi che tutti i binding siano espliciti ed evitare i binding JIT?

Ho cercato dappertutto, ma non riesco davvero a trovare molto per affrontare le prestazioni di base di Guice, a parte le persone che dicono che è molto veloce.

+1

Bene, i moduli vengono valutati solo una volta, ma i provider molte volte. Quindi lo farei esattamente nell'altro modo se c'è un qualsiasi modo per ottenere l'effetto desiderato. Anche singleton: perché evitarli? Abbracciali. Il lavoro svolto una volta non può essere più lento del lavoro svolto due volte. –

+0

Questo non risponde necessariamente alla domanda ... dal profilo, osservo che solo la chiamata a createInjector è la metà del mio tempo di elaborazione. – thebamaman

+0

Il tuo profilo include o esclude i tempi per il caricamento delle classi, GC e JIT? Inoltre: hai controllato la domanda [http://stackoverflow.com/questions/4748405/how-to-improve-guice-performance-at-startup]? –

risposta

3

Prima di tutto, la tua domanda lascia molto a desiderare. Che cosa sono le prestazioni "sub-standard" e come hai deciso cosa significa? È arbitrario? Hai un utente che pensa sia troppo lento? Ci vuole troppo tempo per iniziare o troppo tempo per produrre risultati dall'interazione dell'utente?

Senza codice effettivo da valutare, è difficile risolvere i problemi di prestazioni. Ecco alcuni suggerimenti dalla mia esperienza:

  1. Creare l'iniettore solo una volta. Ho visto un progetto in cui stavano creando un iniettore per ogni richiesta REST e aveva prestazioni orribili. Quando hanno smesso di farlo, la loro API ha ottenuto 15 volte più velocemente. Se hai bisogno di creare più iniettori attraverso il tuo codice, ti suggerisco caldamente di fare refactoring in modo da non averne bisogno.

  2. I singleton possono essere grandi per le prestazioni, basta non abusarne. Vengono creati una sola volta, il che può accadere non appena si crea l'iniettore (singleton desiderosi) o quando viene richiesto per la prima volta da qualcos'altro nel grafico dell'oggetto.

  3. Capire che Guice è una libreria basata sulla riflessione e la riflessione è SEMPRE lenta. Guice fa un ottimo lavoro di essere molto veloce in fase di esecuzione, a spese di un sacco di riflessi quando si crea un iniettore (vedi articolo 1). Se vedi un ritardo notevole nella tua applicazione, probabilmente significa che stai facendo qualcosa di sbagliato.

Infine, se si decide che non si può gestire prestazioni "problemi" di Guice, si potrebbe provare un altro come Dagger da Square (versione 1) e Google (versione 2). Utilizza la generazione del codice anziché la riflessione in modo da non avere il costo di riflessione, ma non è così completo e non ha le estensioni.

+0

... ottimo riassunto. ho solo pensato di chiarire un piccolo punto: Dagger 1 utilizza effettivamente il reflection, mentre Dagger 2 no. – hsl

Problemi correlati