¿Por qué LINQ es más rápido en este ejemplo?

Escribí lo siguiente para probar el rendimiento de usarforeach vsLINQ:

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();
}

Me sale algo como la siguiente salida:

31160 - 116ms
31160 - 95 ms

En cada ejecución, LINQ supera a cada uno en alrededor del 20%. Entendí que los métodos de extensión LINQ usaban el estándar c # debajo de las cubiertas.

Entonces, ¿por qué LINQ es más rápido en este caso?

EDITAR:

Así que cambié mi código para usar cronómetro en lugar de datetime y aún obtengo los mismos resultados. Si ejecuto la consulta LINQ primero, entonces mis resultados muestran que LINQ es aproximadamente un 20% más lento que el de foreach. Esto tiene que ser algún tipo de problema de calentamiento JIT. Mi pregunta es ¿cómo compenso el calentamiento de JIT en mi caso de prueba?

Respuestas a la pregunta(2)

Su respuesta a la pregunta