for (i=0 ; i<=10; i++)
{
..
..
}
i=0;
while(i<=10)
{
..
..
i++;
}
In per e while loop, quale è il migliore, le prestazioni?per ciclo while in C#
for (i=0 ; i<=10; i++)
{
..
..
}
i=0;
while(i<=10)
{
..
..
i++;
}
In per e while loop, quale è il migliore, le prestazioni?per ciclo while in C#
(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.Length
nella 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 ...
Nessuno dei due. Sono equivalenti. Puoi pensare che il ciclo 'for' sia un modo più compatto di scrivere il ciclo while.
Direi che sono uguali e non dovresti mai fare tali micro-ottimizzazioni comunque.
Sì, sono snippet di codice equivalenti.
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.
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.
È possibile fornire fonti e citazioni per l'ottimizzazione delle interruzioni di lunghezza di sollevamento? – Krythic
@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
NoxMortem Grazie – Krythic