ja pisał do testowania wydajności wykorzystania foreach
vs LINQ
:Dlaczego LINQ szybciej w tym przykładzie
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();
}
uzyskać coś podobnego następujące dane wyjściowe:
31160 - 116ms 31160 - 95 ms
W każdym biegu, LINQ wyprzedza foreach o około 20%. Rozumiem, że metody rozszerzenia LINQ używały standardowego C# pod okładkami.
Dlaczego w tym przypadku LINQ jest szybszy?
EDIT:
Więc zmieniłem kod do używania stopera zamiast datetime i wciąż te same wyniki. Jeśli najpierw uruchomię kwerendę LINQ, moje wyniki pokażą, że LINQ jest o około 20% wolniejsze niż foreach. To musi być jakaś kwestia rozgrzewki JIT. Moje pytanie brzmi: jak mogę zrekompensować rozgrzewkę JIT w moim przypadku testowym?
Czy próbowałeś odwrócenie kolejności testów? Możliwe, że obserwujesz czas JIT. Zwykle lepiej najpierw uruchomić test, aby rozgrzać system, * następnie * uruchomić go ponownie i ustawić czas. Ponadto użyj stopera. Zobacz http://ericlippert.com/tag/benchmarks/ –
http://codereview.stackexchange.com/a/14200 –
Jon, myślę, że masz rację. Jak mogę zmienić swój kod, aby odfiltrować czas JIT i uzyskać prawdziwe liczby? – Coltech