2012-09-18 16 views
6

Sto facendo un'applicazione basata su swing dove utilizzo JTable. Ho usato DefaultCellEditor per una delle colonne che richiede la selezione della casella combinata. Ma DefaultCellEditor ha molti metodi che non richiedo. Così ho scritto un custom CellEditor estendendo AbstractCellEditor dove ho implementato solo i metodi richiesti. La mia domanda èLe dimensioni di una classe java influenzano le prestazioni dell'applicazione

(in generale) se abbiamo una classe e se non richiediamo tutti i metodi di quella classe va bene usarla o è bene scrivere una classe personalizzata dove implementiamo solo quei metodi di cui abbiamo bisogno? e

utilizzando la classe personalizzata, le prestazioni (in termini di memoria) dell'applicazione saranno migliorate o rimarranno le stesse della classe che ha tutti i metodi?

Qualsiasi aiuto sarà apprezzato.

+6

"l'ottimizzazione prematura è la radice di tutti i mali" –

+0

@guido "l'ottimizzazione prematura è la radice di tutti i mali" l'ho adorato ..:) – Amarnath

+2

Mathias, stai dicendo che la JVM non carica tutti i metodi di una classe - solo quelli effettivamente chiamati? Hai un riferimento per questo? – Faelkle

risposta

15

A meno che non si abbia un valido motivo per credere che nient'altro nell'applicazione che include lo stesso JDK utilizza DefaultCellEditor,, si sta quasi certamente perdendo tempo facendo peggiorare le cose attivamente.

È inoltre necessario considerare che è possibile che siano stati salvati forse 100 k di codice in casi estremi, in cui il tipico JVMS utilizza circa un gigabyte da eseguire. Quindi potresti aver risparmiato lo 0,01% di spazio del codice. Questo non è un uso produttivo del tuo tempo. La procedura corretta consiste nel testare e misurare dove sono realmente i colli di bottiglia nel tempo e nello spazio, dopo il fatto. I programmatori sono notoriamente poveri nel predire queste cose.

+0

+1. Usa 'DefaultCellEditor' perché sai che funzionerà e non avrai introdotto alcun bug. Una volta terminato, profila il profilo del sistema e se "DefaultCellEditor' appare come hotspot, allora considera la possibilità di personalizzarlo o riscriverlo. Ottimizza per ultimo, quando comprendi pienamente lo spazio del problema e hai una soluzione funzionante. – Faelkle

3

Il codice (il bytecode effettivo) per questa classe viene caricato solo una volta, nella regione di memoria di PermGen, indipendentemente dal numero di oggetti di questo tipo che istanziate.

non avrei accettato questo codice dal momento che si sta duplicando la funzionalità che è già disponibile, e non sei l'aggiunta di funzionalità a AbstractCellEditor, si sta reimplementare codice DefaultCellEditor che è già stato (si spera) testato da Oracle (o Sun).

Come ha detto EJP, non vale il tempo e il potenziale per introdurre bug.

1

Se si crea una classe personalizzata che contiene meno oggetti membro, il footprint di memoria sarà inferiore. Il numero di metodi non influisce sulla dimensione degli oggetti, ma solo sulla dimensione della classe.

In generale, non ottimizzerei prematuramente a meno che non si determini di avere effettivamente un problema (ad esempio se si dispone di migliaia di istanze del log degli oggetti e dell'archivio di heap/garbage collector si rivela che si sta tranciando la memoria e/o avere frequente di collezioni del vecchio spazio), perché il codice addizionale significa:

  • manutenzione aggiuntive (avresti bisogno di assicurarsi che la vostra abitudine CellEditor non è bacato)
  • sforzo supplementare nella scrittura del codice personalizzato
  • Sforzo aggiuntivo nel test del codice personalizzato

AFAIK, a CellEditor viene istanziato come e quando necessario, quindi non si risparmia comunque molta memoria.

+0

La tua prima frase è vera solo se nessun altro usa la classe sostituita, in questo caso 'DefaultCellEditor', e non risponde alla domanda, che riguarda i metodi, non 'oggetti membro'. – EJP

+0

Vero, ma quel genere di cose è difficile da misurare a causa di riferimenti rigidi a oggetti provenienti da altri oggetti. Se passa qualcosa a un costruttore che ha già fatto riferimento altrove nel grafico dell'oggetto, l'impronta superficiale potrebbe aumentare ma la memoria totale utilizzata non lo fa. – Faelkle

Problemi correlati