La creazione di molti metodi in Java può influire sulle prestazioni? [chiuso]

3

Mi è stato detto da un collega che in Java, le prestazioni potrebbero essere peggiori se creiamo più metodi, impilando molti metodi chiamando su di essi in JVM, specialmente in un ambiente Java EE.

Questo sembra in qualche modo sconfiggere il concetto di programmazione orientata agli oggetti. Come se scrivessimo metodi lunghi - ciò che non è buono per la leggibilità del codice - possiamo ottenere più prestazioni a causa di meno metodi nello stack JVM.

Quindi, scrivere molti metodi che chiamano e interagiscono tra loro è peggio delle prestazioni rispetto a scrivere alcuni metodi lunghi per utilizzare meno stack in JVM? Questa è una affermazione corretta?

    
posta Marcelo Rodrigo 09.09.2014 - 20:12
fonte

3 risposte

5

Probabilmente è un'ipotesi sbagliata, in primo luogo perché le chiamate annidate di buon senso non dovrebbero avere alcun risultato di prestazioni (misurabili). Dopo aver fatto qualche ricerca, scoprirai che la JVM può fare alcune ottimizzazioni nel tuo codice "automagicamente":

Ottimizzazione adattiva

E, ancora più importante:

Espansione in linea

Come puoi vedere:

In computing, inline expansion, or inlining, is a manual or compiler optimization that replaces a function call site with the body of the callee

Quindi, probabilmente, se tu come programmatore puoi dire "hey, un grande metodo è meglio che annidare un sacco di altri metodi", JIT / JVM / javac può capirlo e correggerlo > > IF < < vale la pena.

Penso che a meno che non si ottengano statistiche numeriche, si sta bene con tonnellate di metodi invece di un software monolitico.

    
risposta data 09.09.2014 - 20:41
fonte
3

La JVM ha questa cosa chiamata JIT, che ottimizza il codice dell'applicazione con varie tecniche.

Uno di questi è chiamato "ottimizzazione in linea". In questa particolare ottimizzazione, il JIT automaticamente i metodi inline quando necessario, quindi potresti perdere alcuni cicli del processore in questo particolare istante, anche se lo fa, non è sufficiente a giustificare questo tipo di argomentazione secondo me.

È sempre bello ricordare che in genere gli hotspot delle prestazioni sono l'I / O e l'accesso al database. È anche bello ricordare che, oggigiorno, il tempo della macchina è economico e il tempo di sviluppo è costoso.

Ulteriori letture:

risposta data 09.09.2014 - 20:41
fonte
2

Come altri hanno detto, in Java è generalmente meglio usare molti metodi brevi, perché sono JIT e sono meglio in linea.

Ma è plausibile che la situazione ambientale dell'EE possa essere diversa. Almeno per il metodo che non viene semplicemente chiamato, ma c'è un sovraccarico aggiuntivo a causa di 1) Gestione transazioni, 2) Interceptor 3) Chiamate EJB remote (stai lontano da chiamate remote altamente dettagliate)

Ma se dividi il metodo grande in più metodi privati, questi overhead non dovrebbero accadere.

tl, dr: La chiamata al metodo in sé non è un problema, l'overhead aggiuntivo è (e hai il controllo su di esso)

PS: non penserei nemmeno di NON dividere i metodi per ragioni di prestazioni fino a quando non ci sarà un problema di prestazioni. Con codice più chiaro ottieni di solito prestazioni migliori, perché è molto più semplice identificare parti che sono 1) non effettivamente necessarie 2) sono chiamate più volte con lo stesso risultato

    
risposta data 10.09.2014 - 09:35
fonte

Leggi altre domande sui tag