Un test facile à semi-valider. J'ai fait un petit test, juste pour voir. Voici le code:
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();
}
Et voici la section foreach:
foreach (int i in intList)
{
int foo = i * 2;
if (foo % 2 == 0)
{
}
}
Lorsque j'ai remplacé le for par un foreach - le foreach était 20 millisecondes plus rapide - de manière cohérente . Le pour était de 135-139ms tandis que le foreach était de 113-119ms. J'ai échangé plusieurs fois d'avant en arrière, m'assurant que ce n'était pas un processus qui venait juste de démarrer.
Cependant, lorsque j'ai supprimé l'instruction foo et if, le for était plus rapide de 30 ms (foreach était de 88 ms et for était de 59 ms). C'étaient tous les deux des coquilles vides. Je suppose que le foreach a en fait passé une variable alors que le for incrémentait simplement une variable. Si j'ai ajouté
int foo = intList[i];
Ensuite, le for devient lent d'environ 30 ms. Je suppose que cela a à voir avec la création de foo et la saisie de la variable dans le tableau et son affectation à foo. Si vous accédez simplement à intList [i], vous n'avez pas cette pénalité.
En toute honnêteté, je m'attendais à ce que le foreach soit légèrement plus lent dans toutes les circonstances, mais pas assez pour avoir de l'importance dans la plupart des applications.
edit: voici le nouveau code utilisant les suggestions Jons (134217728 est le plus grand int que vous puissiez avoir avant que l'exception System.OutOfMemory ne soit levée):
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();
}
Et voici les résultats:
Générer des données. Calcul de la boucle for: 2458ms Calcul de la boucle foreach: 2005ms
Les échanger pour voir si cela traite de l'ordre des choses donne (presque) les mêmes résultats.