Ein einfacher Test zur Halbvalidierung. Ich habe einen kleinen Test gemacht, nur um zu sehen. Hier ist der 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();
}
Und hier ist der foreach-Abschnitt:
foreach (int i in intList)
{
int foo = i * 2;
if (foo % 2 == 0)
{
}
}
Als ich das for durch ein foreach ersetzte - das foreach war 20 Millisekunden schneller - konstant . Das For war 135-139 ms, während das Foreach 113-119 ms betrug. Ich habe mehrmals hin und her gewechselt, um sicherzugehen, dass es kein Prozess war, der gerade erst begonnen hat.
Als ich jedoch das foo und die if-Anweisung entfernte, war das for um 30 ms schneller (foreach war 88 ms und for war 59 ms). Sie waren beide leere Muscheln. Ich gehe davon aus, dass foreach tatsächlich eine Variable übergeben hat, bei der for nur eine Variable inkrementiert hat. Wenn ich hinzufügte
int foo = intList[i];
Dann wird das for um ca. 30ms langsam. Ich gehe davon aus, dass dies damit zu tun hat, dass foo erstellt, die Variable im Array erfasst und foo zugewiesen wird. Wenn Sie nur auf intList [i] zugreifen, haben Sie diese Strafe nicht.
Um ehrlich zu sein. Ich habe erwartet, dass der Foreach unter allen Umständen etwas langsamer ist, aber nicht genug, um in den meisten Anwendungen eine Rolle zu spielen.
Bearbeiten: Hier ist der neue Code mit Jons Vorschlägen (134217728 ist der größte Int, den Sie haben können, bevor die System.OutOfMemory-Ausnahme ausgelöst wird):
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();
}
Und hier sind die Ergebnisse:
Daten generieren. Berechnung für Schleife: 2458 ms Berechnung für jede Schleife: 2005 ms
Wenn Sie sie austauschen, um zu sehen, ob es sich um die Reihenfolge der Dinge handelt, erhalten Sie (fast) die gleichen Ergebnisse.