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 ersetzt habe, war das foreach 20 Millisekunden schneller. durchgehend . Das for war 135-139ms, während das foreach 113-119ms war. Ich habe mehrmals hin- und hergeschaltet, um sicherzustellen, dass es sich nicht um einen Prozess handelt, 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). Es waren beides leere Shells. Ich nehme an, dass foreach tatsächlich eine Variable übergeben hat, während for nur eine Variable inkrementiert hat. Wenn ich Folgendes hinzufüge
int foo = intList[i];
Dann werden die für um etwa 30ms langsamer. Ich nehme an, dass dies mit der Erstellung von foo und dem Zugriff auf die Variable im Array und deren Zuweisung an foo zu tun hat. Wenn Sie nur intList[i] zugreifen, dann haben Sie diese Strafe nicht.
Um ehrlich zu sein Ich habe erwartet, dass 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äge (134217728 ist die größte int können Sie haben, bevor 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:
Generierung von Daten. Berechnung der for-Schleife: 2458ms Berechnen der foreach-Schleife: 2005ms
Wenn man sie vertauscht, um zu sehen, ob es mit der Reihenfolge der Dinge zu tun hat, erhält man (fast) die gleichen Ergebnisse.