2010-07-09 4 views
11

Ho sentito da un altro sviluppatore che un oggetto è troppo costoso da istanziare ripetutamente perché "ha un sacco di metodi".Esiste un costo per metodo per l'istanziazione degli oggetti in Java?

La mia comprensione (da Bloch, principalmente) era che la creazione di oggetti è costosa soprattutto attraverso le cose fatte esplicitamente nel costruttore, specialmente creando altri oggetti costosi.

Esiste un costo per metodo per un nuovo oggetto in Java? Non sto pensando, ma ho bisogno di riferimenti se qualcuno li ha.

Grazie!

+3

Suggerisco di creare una classe che non ha metodi e un'altra che ha 100 metodi, quindi calcolare il tempo necessario per creare un'istanza di un milione circa di volte. Quindi fallo parecchie volte per essere sicuro. (La mia risposta istintiva sarebbe che no, i metodi non fanno la differenza, ma non credetemi.) –

+0

Ho bisogno di creare alcuni tester di temporizzazione per questo genere di cose. Ce ne sono già là fuori? Un'altra domanda SO .... – orbfish

risposta

11

Molti metodi indicano un grande virtual method table (VMT). Tuttavia, il VMT è per classe esattamente come i metadati e pertanto ha al massimo un costo una tantum nella prima istanza. Le istanze successive sono altrettanto veloci degli oggetti con meno metodi, supponendo che il/i costruttore/i non effettui il sollevamento pesante.

Vale la pena leggere anche il capitolo object creation from the performance tuning book.

+2

* "... hanno al massimo un costo una tantum nella prima istanza" *. In realtà, il costo è sostenuto in fase di caricamento in classe. –

+0

Grazie per la risposta. Il libro sembra un po 'datato, ma sto dando un'occhiata. – orbfish

+0

@Stephen C, che potrebbe dipendere dalla VM utilizzata e da come funziona il JIT. Questo è il motivo per cui ho scritto "al massimo" - potrebbe caricare pigramente le classi, e la classe può essere caricata abbastanza tardi, fondamentalmente innescata dalla loro istanziazione. – Lucero

3

No, non esiste alcuna relazione tra il numero di metodi su una classe e il tempo per la JVM per eseguire un'operazione new.

Seriamente, se stai pensando a questo tipo di livello non dovresti usare un linguaggio come Java, vai e scrivi la tua applicazione in assembler o "C".

La verità è che dovresti concentrarti sulla progettazione dei tuoi algoritmi e delle strutture dati, queste avranno un effetto molto più profondo sulle prestazioni delle tue applicazioni rispetto a qualsiasi micro ottimizzazione potenziale.

+2

+1 per evidenziare che se pensi che le prestazioni di creazione dell'oggetto siano un problema non dovresti usare java ... –

+3

Se leggi attentamente la mia domanda, vedrai che non sono io a pensare "a questo livello" - Sto cercando di creare un buon design, ma sto imbattendo in resistenza basata su affermazioni infondate. Insulto non apprezzato. – orbfish

+1

@inflagranti FYI c'è un intero capitolo su di esso nel libro di riferimento precedentemente, e anche in Java efficace. Ti lascio andare dire agli autori che non dovrebbero usare Java;) – orbfish

1

Per inciso, ci sarebbe un leggero calo di prestazioni per una classe con molte variabili di istanza (non sono sicuro che sarebbe davvero misurabile). Java richiede che ogni variabile di istanza sia impostata su 0, false, null per ogni nuova istanza e che sia presente un costo di runtime associato all'impostazione a zero. Tuttavia è probabilmente solo un memset (o calloc o qualcosa di simile) che è veloce da completare.

0

Ho bisogno di riferimenti se qualcuno li ha.

mi suggeriscono che è l'altro sviluppatore che dovrebbe essere chiesto per i riferimenti per sostenere la sua affermazione ridicola.

+0

Ho appena iniziato qui. Forse in tempo .... – orbfish

+1

Gioca solo stupido. Di 'davvero? Dove lo dice? Come potrebbe funzionare? Perché un metodo extra dovrebbe costare di più al momento dell'istanziazione degli oggetti? ' – EJP

Problemi correlati