rareza de rendimiento en bucle en .NET x64: ¿afinidad de iteración de número par?

Al ejecutar un bucle for vacío con un gran número de iteraciones, obtengo números muy diferentes en cuanto al tiempo de ejecución:

public static class Program
{
    static void Main()
    {
        var sw = new Stopwatch();
        sw.Start();
        for (var i = 0; i < 1000000000; ++i)
        {
        }
        sw.Stop();
        Console.WriteLine(sw.ElapsedMilliseconds);
    }
}

Lo anterior se ejecutará en alrededor de 200 ms en mi máquina, pero si lo aumento a 1000000001, entonces toma4x tan largo! Entonces, si lo hago 1000000002, ¡se reduce a 200 ms de nuevo!

Estaparece suceder para un número par de iteraciones. Si voyfor (var i = 1; i < 1000000001, (nota comenzando en 1 en lugar de 0) entonces es 200ms. O si lo hagoi <= 1000000001 (note menos deo igual) entonces son 200ms. O(var i = 0; i < 2000000000; i += 2) también.

Esto parece estar solo en x64, pero en todas las versiones de .NET hasta (al menos) 4.0. También aparece solo cuando está en modo de liberación con el depurador desconectado.

ACTUALIZAR Estaba pensando que esto probablemente se debía a algún cambio inteligente en el jit, pero lo siguiente parece refutarlo: si haces algo como crear un objeto dentro de ese bucle, entoncesese toma alrededor de 4 veces más largo también:

public static class Program
{
    static void Main()
    {
        var sw = new Stopwatch();
        sw.Start();
        object o = null;
        for (var i = 0; i < 1000000000; i++)
        {
            o = new object();
        }
        sw.Stop();
        Console.WriteLine(o); // use o so the compiler won't optimize it out
        Console.WriteLine(sw.ElapsedMilliseconds);
    }
}

Esto toma alrededor de 1 segundo en mi máquina, pero luego aumenta de 1 a 1000000001.4 segundos. Eso es un extra de 3000 ms, por lo que no podría deberse a un cambio de bits, ya que eso también habría mostrado una diferencia de 3000 ms en el problema original.

Respuestas a la pregunta(1)

Su respuesta a la pregunta