Я написал следующее, чтобы проверить эффективность использования foreach
vs LINQ
:
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();
}
Я получаю что-то вроде следующего вывода:
31160 - 116ms 31160 - 95 ms
В каждом прогоне LINQ превосходит foreach примерно на 20%. Насколько я понимаю, методы расширения LINQ использовали стандартные С# под обложками.
Итак, почему LINQ быстрее в этом случае?
EDIT:
Итак, я изменил свой код на использование секундомера вместо datetime и все равно получаю те же результаты. Если я сначала запустил запрос LINQ, тогда мои результаты показывают, что LINQ будет примерно на 20% медленнее, чем foreach. Это должно быть какая-то проблема теплоснабжения JIT. Мой вопрос в том, как я могу компенсировать разминку JIT в моем тестовом случае?