2009-02-16 27 views

risposta

46

(aggiornamento) In realtà, esiste uno scenario in cui il costrutto for è più efficiente; loop su un array. Il compilatore/JIT ha ottimizzazioni per questo scenario fino a quando si usaarr.Lengthnella condizione:

for(int i = 0 ; i < arr.Length ; i++) { 
    Console.WriteLine(arr[i]); // skips bounds check 
} 

In questo caso molto specifico, si salta il controllo dei limiti, in quanto sa già che non potrà mai essere fuori dai limiti. È interessante notare che, se si "paranco" arr.Length per cercare di ottimizzare manualmente, si impedisce che ciò accada:

int len = arr.Length; 
for(int i = 0 ; i < len ; i++) { 
    Console.WriteLine(arr[i]); // performs bounds check 
} 

Tuttavia, con altri contenitori (List<T> ecc), sollevamento è abbastanza ragionevole come un manuale di micro-ottimizzazione.

(aggiornamento end)


Né; un ciclo for viene comunque valutato come un ciclo while sotto il cofano.

Ad esempio 12.3.3.9 di ECMA 334 (assegnazione definitiva) impone che un ciclo:

for (for-initializer ; for-condition ; for-iterator) embedded-statement 

è essenzialmente equivalente (da un assegnazione Definite prospettiva (non proprio equivale a dire "il compilatore deve generare questo iL ")) come:

{ 
    for-initializer ; 
    while (for-condition) { 
     embedded-statement ; 
     LLoop: 
     for-iterator ; 
    } 
} 

con continuare dichiarazioni che colpiscono l'istruzione for viene tradotto in dichiarazioni goto che hanno come target l'etichetta LLoop. Se la condizione for è omessa dall'istruzione for, quindi la valutazione di assegnazione definita procede come se la condizione for fosse sostituita con true nell'espansione precedente.

Ora, questo non significa che il compilatore ha a che fare esattamente la stessa cosa, ma in realtà lo fa praticamente ...

+0

È possibile fornire fonti e citazioni per l'ottimizzazione delle interruzioni di lunghezza di sollevamento? – Krythic

+0

@Krythic si è appena imbattuto in questo: https://codeblog.jonskeet.uk/2009/01/29/for-vs-foreach-on-arrays-and-lists/ post sul blog di Jon Skeet. – NoxMortem

+0

NoxMortem Grazie – Krythic

2

Nessuno dei due. Sono equivalenti. Puoi pensare che il ciclo 'for' sia un modo più compatto di scrivere il ciclo while.

12

Direi che sono uguali e non dovresti mai fare tali micro-ottimizzazioni comunque.

-1

Sì, sono snippet di codice equivalenti.

6

La performance sarà la stessa. Tuttavia, a meno che non sia necessario accedere alla variabile i all'esterno del ciclo, è necessario utilizzare il ciclo for. Questo sarà più pulito poiché i avrà solo scope all'interno del blocco.

3

L'efficienza del programma deriva da algoritmi corretti, buona progettazione di oggetti, architettura intelligente del programma, ecc.

La rasatura di un ciclo o due con cicli for contro loop while non eseguirà MAI un programma lento o un programma veloce lento.

Se si desidera migliorare le prestazioni del programma in questa sezione, trovare un modo per srotolare parzialmente il ciclo (vedere Duff's Device) o migliorare le prestazioni di ciò che viene fatto all'interno del ciclo.