Il modo migliore per gestire le variabili utilizzate in un ciclo for? [duplicare]

-3

Da esperienze precedenti, ho sempre pensato che, se si intende utilizzare le variabili all'interno di un ciclo for, era molto meglio dichiararle al di fuori del ciclo rispetto al loop stesso. Recentemente ho fatto una revisione del codice e diversi sviluppatori più giovani hanno affermato che ciò non era vero e che dovevo inserire le dichiarazioni delle variabili all'interno del {} del ciclo for.

Forse i compilatori sono diventati più efficienti, ma sembra che ciò causerebbe un discreto numero di memorie release / garbage collects poiché ogni iterazione dichiarerebbe una nuova istanza di ogni variabile, specialmente dato che la maggior parte di esse sono stringhe che sono immutabili.

    
posta user25839 04.01.2016 - 00:49
fonte

3 risposte

1

Nel contesto di C #, è difficile immaginare come la dichiarazione della variabile in un ambito o nell'altro influisce sulla garbage collection. In C # e Java, scope non impone il recupero della memoria (mentre d'altra parte ha implicazioni in C ++).

Le variabili locali, in particolare in C #, sono per lo più gratuite. Quindi, dichiarandone uno in un ambito interno, anche se il looping è fondamentalmente gratuito.

È possibile che alcune espressioni di inizializzazione per qualcosa che potrebbe essere riutilizzato (ad esempio invariata) nel ciclo sia più efficiente quando fuori dal ciclo, tuttavia, la tua domanda non lo menziona direttamente, e sembra essere interessato al costo delle variabili.

In generale, è meglio dichiarare le variabili nel più piccolo ambito possibile. In generale, è prematuro considerare le prestazioni prima di altri fattori, ma in questo caso non c'è praticamente alcuna tensione tra le prestazioni e lo stile di codifica gestibile.

    
risposta data 04.01.2016 - 03:53
fonte
1

È peggio di così, Jim ...

Dato che hai taggato la domanda c# , non sei solo sbagliato nell'assumere che ci siano dei vantaggi in termini di prestazioni (si tratta di un'ottimizzazione banale, uno qualsiasi eseguirà un compilatore a metà strada), ma anche assumendo che le dichiarazioni vengono rieseguiti su ogni loop pass. In effetti, la variabile avrà lo spazio ad esso assegnato ad un certo punto tra l'entrata nel loop e il suo primo utilizzo, e verrà liberata qualche volta dopo il suo ultimo utilizzo. Nel caso di una variabile non primitiva ( ie , un oggetto), solo l'esecuzione di un operatore new causerà effettivamente la creazione dell'oggetto, indipendentemente da dove viene dichiarata la variabile, e ogni new creerà un nuovo oggetto, ogni volta.

    
risposta data 04.01.2016 - 04:01
fonte
0

Generalmente vuoi limitare il più possibile la portata dei tuoi oggetti. Se la tua variabile è usata solo all'interno del ciclo e non hai bisogno di portare lo stato tra le iterazioni, allora sì di solito lo vuoi dichiarare all'interno del ciclo in modo che ogni iterazione contenga una nuova variabile.

A volte questo comporta penalità per le prestazioni, come suggerisci tu. Scommetto che è piuttosto raro, specialmente con i moderni ottimizzatori di compilatori, ma è comunque concepibile.

Come sempre, il miglior consiglio che posso dare è misurarlo se pensi che ci sia un problema. Se proprio ne hai bisogno, allora sposta la dichiarazione all'esterno e assicurati di "resettare" la variabile all'inizio di ogni iterazione, se è quello che risulta più economico. Tieni presente che il tuo codice avrà un significato leggermente inferiore per i lettori, quindi devi scrivere un commento per spiegare la tua scelta (se non altro per impedire ai futuri manutentori di annullarlo) ed essere extra attento a non causare bug.

Quindi, gli sviluppatori più giovani avevano ragione? Sì, nel principale. Ma - come sempre - regole di contesto.

    
risposta data 04.01.2016 - 02:30
fonte

Leggi altre domande sui tag