Un test facile da semi-convalidare. Ho fatto un piccolo test, solo per vedere. Ecco il codice:
static void Main(string[] args)
{
List<int> intList = new List<int>();
for (int i = 0; i < 10000000; i++)
{
intList.Add(i);
}
DateTime timeStarted = DateTime.Now;
for (int i = 0; i < intList.Count; i++)
{
int foo = intList[i] * 2;
if (foo % 2 == 0)
{
}
}
TimeSpan finished = DateTime.Now - timeStarted;
Console.WriteLine(finished.TotalMilliseconds.ToString());
Console.Read();
}
Ed ecco la sezione foreach:
foreach (int i in intList)
{
int foo = i * 2;
if (foo % 2 == 0)
{
}
}
Quando ho sostituito il for con un foreach, il foreach era più veloce di 20 millisecondi, in modo coerente . Il for era di 135-139 ms mentre il foreach era di 113-119 ms. Ho scambiato avanti e indietro diverse volte, assicurandomi che non fosse un processo che si è semplicemente attivato.
Tuttavia, quando ho rimosso il foo e l'istruzione if, for era più veloce di 30 ms (foreach era 88ms e for era 59ms). Erano entrambi gusci vuoti. Suppongo che foreach abbia effettivamente passato una variabile dove come for stava solo incrementando una variabile. Se ho aggiunto
int foo = intList[i];
Quindi il per diventa lento di circa 30 ms. Presumo che questo avesse a che fare con la creazione di foo e il recupero della variabile nell'array e l'assegnazione a foo. Se accedi a intList [i], non hai quella penalità.
In tutta onestà .. mi aspettavo che foreach fosse leggermente più lento in tutte le circostanze, ma non abbastanza da essere importante nella maggior parte delle applicazioni.
modifica: ecco il nuovo codice utilizzando i suggerimenti di Jons (134217728 è il più grande int che puoi avere prima che venga generata l'eccezione System.OutOfMemory):
static void Main(string[] args)
{
List<int> intList = new List<int>();
Console.WriteLine("Generating data.");
for (int i = 0; i < 134217728 ; i++)
{
intList.Add(i);
}
Console.Write("Calculating for loop:\t\t");
Stopwatch time = new Stopwatch();
time.Start();
for (int i = 0; i < intList.Count; i++)
{
int foo = intList[i] * 2;
if (foo % 2 == 0)
{
}
}
time.Stop();
Console.WriteLine(time.ElapsedMilliseconds.ToString() + "ms");
Console.Write("Calculating foreach loop:\t");
time.Reset();
time.Start();
foreach (int i in intList)
{
int foo = i * 2;
if (foo % 2 == 0)
{
}
}
time.Stop();
Console.WriteLine(time.ElapsedMilliseconds.ToString() + "ms");
Console.Read();
}
Ed ecco i risultati:
Generazione di dati. Calcolo per loop: 2458 ms Calcolo per loop foreach: 2005 ms
Scambiandoli per vedere se si tratta dell'ordine delle cose produce gli stessi risultati (quasi).