Noté que la fluctuación de fase de C# produce un código considerablemente más lento que el compilador de C++, incluso si no se usan construcciones de "sobrecarga gestionada" (como matrices con indexación comprobada).Mejoras de jitter de C# en futuras versiones de framework
Para cuantificarlo, lo cronometré el siguiente bucle simple:
public static int count = 1000000000;
public static int Main()
{
int j = 0;
for (int i = 0; i < count; ++i)
{
j += (i % 2 == 0) ? ((i + 7) >> 3) : (i * 7);
}
return j;
}
Este bucle se lleva 3.88s para ejecutar (compilado con/O). El bucle equivalente compilado con VC 2010 (-O2) tarda 2.95 s.
Para verificar que se generó código inferior, comparé códigos de máquina: creé una lista (/ FA) del compilador VC, y adjunté un depurador al programa C# (después de completar el ciclo).
De hecho, la versión C++ está utilizando algunos trucos ingeniosos. Por ejemplo, para evitar la multiplicación costosa por 7, hay un registro separado que se incrementa en 7 cada cuenta de bucle. La versión C# hace la multiplicación (imul) cada vez. Hay otras diferencias también.
Entiendo que C# jitter tiene mucho menos tiempo para compilar el código en tiempo de ejecución que VC en tiempo de compilación. Pero, p. Java jitter optimiza dinámicamente los métodos utilizados con frecuencia. C# no parece estar haciéndolo.
Mi pregunta es: ¿hay planes para mejorar la inestabilidad de C# en las futuras versiones de framework?
Visual Studio RC 2012 con .NET 4.5 está disponible para descargar desde ayer. Descárguelo (es gratis) y ejecute la misma prueba allí. –
Dejé de contener la respiración por nuevas optimizaciones hechas por el jitter hace mucho tiempo. MS parece pensar que es lo suficientemente bueno en ese departamento. – harold
@harold ¿Desde cuándo? –