ich die Leistung mit foreach
vs LINQ
folgendes zu testen schrieb:Warum ist LINQ schneller in diesem Beispiel
private class Widget
{
public string Name { get; set; }
}
static void Main(string[] args)
{
List<Widget> widgets = new List<Widget>();
int found = 0;
for (int i = 0; i <= 500000 - 1; i++)
widgets.Add(new Widget() { Name = Guid.NewGuid().ToString() });
DateTime starttime = DateTime.Now;
foreach (Widget w in widgets)
{
if (w.Name.StartsWith("4"))
found += 1;
}
Console.WriteLine(found + " - " + DateTime.Now.Subtract(starttime).Milliseconds + " ms");
starttime = DateTime.Now;
found = widgets.Where(a => a.Name.StartsWith("4")).Count();
Console.WriteLine(found + " - " + DateTime.Now.Subtract(starttime).Milliseconds + " ms");
Console.ReadLine();
}
ich so etwas wie folgende Ausgabe:
31160 - 116ms 31160 - 95 ms
In jedem Lauf, LINQ outperforms foreach um etwa 20%. Es war mein Verständnis, dass die LINQ-Erweiterung Methoden Standard C# unter den Abdeckungen verwendet.
Warum ist LINQ in diesem Fall schneller?
EDIT:
Also änderte ich meinen Code Stoppuhr zu verwenden, anstatt von Datetime und immer noch die gleichen Ergebnisse zu erhalten. Wenn ich zuerst die LINQ-Abfrage ausführe, zeigen meine Ergebnisse, dass LINQ ungefähr 20% langsamer ist als foreach. Dies muss eine Art JIT-Warmnup-Problem sein. Meine Frage ist, wie kann ich JIT Aufwärmen in meinem Testfall kompensieren?
Haben Sie versucht, die Reihenfolge der Tests Umkehren? Möglicherweise sehen Sie JIT-Timing. Es ist im Allgemeinen besser, den Test einmal zu starten, um das System aufzuwärmen, * dann * führe es erneut aus und takte es ab. Verwenden Sie auch Stoppuhr. Siehe http://ericlippert.com/tag/benchmarks/ –
http://codereview.stackexchange.com/a/14200 –
Jon, ich denke du hast Recht. Wie kann ich meinen Code ändern, um das JIT-Timing herauszufiltern und reelle Zahlen zu erhalten? – Coltech