2012-11-19 14 views
9

Voglio leggere i documenti ed elaborarli. Ogni iterazione elabora un documento.Istanze e iterazioni. Qual è il migliore?

Quale tipo di codice è migliore?

1.

BufferedReader br; 
for(File f : files) 
{ 
    br = new BufferedReader(......); 
    ...... 
} 

2.

for(File f : files) 
{ 
    BufferedReader br = new BufferedReader(......); 
    ...... 
} 

Il mio punto è che uno è più efficiente in termini di spazio e velocità?

+1

aggiornamento intestazione @FedericoCristina (y) –

risposta

3

Se non si utilizza la variabile br altrove, sono entrambi esattamente uguali.

Attenzione a non perdere troppo tempo nel tentativo di nano-ottimizzazioni. Anche quando il bytecode è diverso, la JIT non è così male quando si ottimizza l'ovvio. Non è necessario dichiarare una variabile prima del blocco in cui è utilizzata e non si dovrebbe perché rende meno chiaro a cosa serve.

11

Quest'ultimo è più chiaro a mio avviso. In generale, preferisci dichiarare variabili locali con l'ambito più piccolo possibile, inizializzandole idealmente nel punto di dichiarazione.

non sarà direttamente influire sulle prestazioni - ma che interesserà la leggibilità e la manutenzione, che interesserà la facilità con cui è possibile apportare modifiche che saranno influire sulle prestazioni.

In generale:

  • Calcolare i requisiti di prestazioni e comportamentali (e come ti testare entrambi)
  • Scrivi il codice più pulito più semplice che realizza il comportamento si vorrà
  • See se soddisfa i requisiti di prestazione
  • In caso contrario, analizzare dove si trova il problema e apportare la modifica "meno sporca" per migliorare le cose. (Ciò potrebbe significare apportare un cambiamento di progettazione piuttosto che una micro-ottimizzazione.)
  • Mescolare, sciacquare, ripetere finché non si ottiene il codice che soddisfa i requisiti di prestazione ed è il più pulito possibile.
+0

stampa questa risposta ed appendere nel mio cubicolo. –

5
  1. Sono esattamente lo stesso e tutte le differenze si perdono dopo la compilazione in bytecode.
  2. Anche se immaginiamo il peggiore scenario possibile, che teoricamente (in un altro Java) equivalga a una sola memoria extra, la differenza sarebbe così ridicolmente piccola da richiedere l'orologio atomico più preciso del mondo per misurarlo.
  3. La vera differenza per voi dovrebbe risiedere nella manutenibilità complessiva del vostro codice e questo dovrebbe essere un problema molto più grave di una vera differenza di velocità inferiore al 2-3%. Ad esempio, molti schemi di progettazione introducono un qualche tipo di overhead, ma le persone sono più che disposte a pagare per la quantità di flessibilità che fornisce il codice base.

In ottimizzazione del codice è molto facile cadere nella trappola di Win Piccolo, Lose Big: ogni singolo metodo può essere ottimizzato alla perfezione, ma le prestazioni complessive del sistema può ancora essere un disastro a causa delle inadeguatezze del architettura globale. Uno deve sempre ottimizzare il top-down e, nel fare ciò, vedrai che solo l'1% o meno di linee di codice può effettivamente contribuire alle prestazioni complessive se sostituito da una versione ottimizzata.

+0

Se ricordo correttamente, 1) non è corretto: 'br' non è più definito dopo che il ciclo termina nel secondo esempio, una volta lasciato l'ambito in cui è stato definito. Ciò semplifica la manutenzione, dal momento che non è possibile riutilizzare accidentalmente la variabile. – Izkata

+0

@izkata 1) non riguarda le differenze di manutenzione, ma l'efficienza di runtime. Il compilatore rileva facilmente che l'uso di 'br' termina con il ciclo' for' e lo tratta come se fosse dichiarato all'interno. –

0

In termini di efficienza, entrambi sono uguali, la maggior parte delle volte vengono compilati con codici byte simili.

Leggibilità: il secondo approccio è migliore. Di solito, aiuta molto quando il codice cresce. Specialmente durante il debugging non ti devi preoccupare che la variabile venga modificata in seguito all'esterno di quel blocco.

1

L'unica differenza è che lo br è il secondo caso è locale in ambito di loop mentre nel primo caso è possibile accedere al ciclo esterno. Notare che anche nel primo caso la variabile di riferimento br potrebbe essere disponibile al di fuori del loop e non i valori che gli avete fornito all'interno del ciclo.

Altrimenti sono uguali. Se il secondo caso è più leggibile

0

3.

for(File f : files) 
{ 
    try(BufferedReader br = new BufferedReader(......)) 
    { 
     ...... 
    } 
} 
Problemi correlati