2013-04-29 10 views
26

Ho appena installato il Unnecessary Code Detector per Eclipse e l'ho eseguito sul mio progetto. Vedo molto del cosiddetto "codice morto". Anche se, dal punto di vista organizzativo, ha senso per rimuovere codice morto/inutili, mi ha fatto pensare:Il codice "morto" ostacola le prestazioni dell'applicazione Java?

fa codice morto realtà ostacolare le prestazioni di un Java app?!?!

Per me, se il codice è veramente "morto", non viene mai eseguito, quindi non vedo come rimuoverlo (anche in questo caso, eccetto per scopi organizzativi/di pulizia/codice) potrebbe migliorare le prestazioni.

+3

Se stai facendo qualsiasi tipo di riflessione potrebbe rallentarlo. – Pace

+0

Una domanda interessante sarebbe: i metodi non ordinari portano a importazioni non ordinate –

+1

Risposta breve, sì. Ma la performance è un animale completamente diverso che deve essere attaccato in un modo diverso. – Siddharth

risposta

21

potrebbe influenzare alcune cose ...

  • dimensione dell'applicazione
  • memoria utilizzata quando l'applicazione è in esecuzione
  • prestazioni Diminuzione sulla scansione pacchetto (se applicabile)
+0

Grazie a @Webnet (+1) - una cosa che ancora non capisco è il motivo per cui il codice morto si accumulerebbe nella memoria dell'heap quando l'app è in esecuzione. Puoi elaborare un po '? Grazie ancora! –

+2

@TicketMonster - Credo che un'applicazione in esecuzione debba mantenere un "indice" di ordinamento per gli oggetti, quindi quando vengono importati sa che sono lì e dove trovarli. Mentre l'impronta è piccola, a seconda di quanto "codice morto" hai, potrebbe sommarsi. – Webnet

+0

Grazie ancora @Webnet (di nuovo 1) - puoi indicarmi qualsiasi cosa specifica nella documentazione JVM (o in qualsiasi altro luogo) per eseguire il follow-up su questo? –

30

Non credo che il "codice morto" possa ostacolare le prestazioni delle applicazioni, ma ostacolerà le prestazioni di sviluppo, che è invariabilmente più costosa.

Ove possibile, il compilatore JIT può rimuovere questo tipo di codice guasto - vedere dead-code elimination. Suppongo, in teoria, se il compilatore JIT ha rimosso enormi quantità di codice morto che potrebbero avere effetto sulla compilazione iniziale.

Tuttavia dubito che ciò si verificherebbe nella pratica e consiglierei solo la rimozione del codice morto per semplificare/accelerare lo sviluppo.

+1

Non ho alcuna obiezione contro il 'ostacolare le prestazioni di sviluppo', ma hai qualcosa per eseguire il backup' non pensare che il "codice morto" possa ostacolare l'applicazione performance'? – nhahtdh

+1

Se il compilatore JIT lo rimuove, non vedo che si tratti di un problema. –

+0

Tuttavia, mi sono assicurato di aver detto "pensa" perché preferirei testarlo personalmente per assicurarmi che non rallentasse il codice. –

1

Potrebbe influire sulle prestazioni dell'applicazione.

Modifica

Un modo di vedere le cose è; il codice morto aggiungerà un po 'di memoria extra alla tua applicazione in esecuzione. Quindi influenzerà anche le prestazioni delle applicazioni.

+3

Se il codice non viene mai eseguito, non utilizzerà alcuna memoria heap, solo PermGen (per memorizzare il codice compilato) –

+0

d'accordo .. ho appena saltato la pistola. grazie per la correzione ho aggiornato la mia risposta. –

+0

Grazie @ rai.skumar (+1) - quindi tutto il codice compilato viene memorizzato nel PermGen? E la cache del codice? –

4

Potrebbe influire un po ', ma il compilatore JIT dovrebbe essere in grado di rilevare ed eliminare metodi che non vengono mai utilizzati. E anche se così non fosse, le spese generali (memoria, tempo di caricamento, tempo di compilazione JIT, ecc.) Sono probabilmente ridotte.

Un motivo molto migliore per eliminare i metodi morti è eliminare le "vecchie cose" che rendono più difficile leggere, verificare e mantenere il codice base. Se questo è un codice che potresti aver bisogno di nuovo, puoi sempre recuperarlo dal controllo della versione.


Cosa succede se chiedere all'utente quale metodo si desidera chiamare? , prendi l'input come una stringa e quindi invoca quel metodo usando reflection ?. Il JIT non può dire quale metodo verrà usato in modo che non possa rimuovere alcun metodo :).

Buon punto. Quindi probabilmente non eliminerà i metodi nella pratica. (Ma potrebbe ... se il classloader sapesse dove ricaricare il metodo da ...)

I metodi morti aumentano l'area del metodo in JVM.

Sì, anche se l'aumento della memoria percentuale è probabilmente insignificante. E la conseguente riduzione delle prestazioni è probabilmente ancora meno significativa.

Anche un metodo che non viene mai chiamato non verrà mai compilato JIT, quindi è probabile che non si incorre in un 50% o più di utilizzo della memoria per un tipico metodo live.

Quindi un numero eccessivo di codice morto porta allo scarico di classi dall'area del metodo (heap) che potrebbe influire sulle prestazioni dell'app. ho ragione?.

Ciò è altamente improbabile. Una classe verrà scaricata solo se non vi sono riferimenti e il suo classloader è irraggiungibile. E se dovesse succedere, la classe non verrebbe utilizzata nuovamente, quindi è giusto scaricarla.

+0

* Il compilatore JIT dovrebbe essere in grado di rilevare ed eliminare i metodi * - Cosa succede se chiedo all'utente * quale metodo si desidera chiamare? *, Prendere l'input come stringa e quindi richiamare quel metodo usando reflection ?. Il JIT non può dire quale metodo verrà usato in modo che non possa rimuovere alcun metodo :). I metodi morti aumentano l'area del metodo in JVM. Quindi un codice troppo lungo può portare allo scarico di classi dall'area del metodo (heap) che potrebbe influire sul rendimento dell'app. ho ragione?. PS: mi scuso per * cercando di rispondere * e * facendo una domanda * allo stesso tempo. :( – TheLostMind