2011-09-02 10 views
11

Un seguimiento de Does .NET JIT optimize empty loops away?:¿Hay alguna forma de obtener el compilador .NET JIT o C# para optimizar los bucles for-out vacíos?

El siguiente programa ejecuta un bucle vacío mil millones de veces e imprime el tiempo de ejecución. Se necesitan 700 ms en mi máquina, y tengo curiosidad si hay una forma de obtener la inestabilidad para optimizar el bucle vacío.

using System; 

namespace ConsoleApplication1 { 
    class Program { 
     static void Main() { 
      var start = DateTime.Now; 
      for (var i = 0; i < 1000000000; i++) {} 
      Console.WriteLine((DateTime.Now - start).TotalMilliseconds); 
     } 
    } 
} 

Por lo que yo puedo decir que la respuesta es no, pero no sé si hay opciones de compilación ocultos Puede que no he probado. Me he asegurado de compilar en modo de lanzamiento y ejecutar sin ningún tipo de depurador conectado, pero todavía se están tomando 700 ms para ejecutar este ciclo vacío. También probé NGEN con el mismo resultado (aunque tengo entendido que debería producir el mismo código compilado que el JIT de todos modos, ¿no?). Sin embargo, nunca antes había usado NGEN y podría estar mal.

Se parece como esto sería algo fácil para el JIT para encontrar y optimizar distancia, pero sabiendo muy poco sobre cómo el nerviosismo trabajo en general, estoy ansioso por ver si hay una razón específica esta optimización se habría quedado fuera . También el compilador de VC++ definitivamente parece hacer esta optimización, entonces me pregunto por qué la discrepancia. ¿Algunas ideas?

+6

¿Por qué es esto un problema para usted en realidad? Si tienes un bucle vacío, deshazte de él. –

+0

¿En qué se diferencia esto de la pregunta a la que hace referencia? –

+0

@Reed Sé que Java tiene opciones de JIT como servidor y cliente. La pregunta de referencia no pregunta nada sobre las opciones que pueden engatusar la inestabilidad para optimizar esto. –

Respuesta

7

No, ninguno de los nervios de .NET que sé eliminan los bucles vacíos. La razón exacta por la que no es tan claro para mí, el optimizador de jitter ciertamente sabe cómo hacer optimizaciones como esa y elimina rápidamente el código muerto. Compruebe this answer para más detalles. Creo que esto fue intencional, dejando el lazo en su lugar para su posible efecto secundario, el tiempo de consumo. Lo cual, por supuesto, solo tiene sentido para bucles muy cortos para implementar un spinwait.

+3

Sin embargo, es una especie de lógica extraña. Todo el punto en la optimización del código es hacer que consuma menos tiempo.Si decide preservar la cantidad de tiempo invertido, de alguna manera socava toda la idea de optimizar. – jalf

+4

Un spinwait es una optimización. –

+0

Ver el bucle vacío me recuerda los programas DOS de la escuela mal escritos que usaban bucles vacíos para introducir retrasos o dependían del tiempo de la CPU para aplicar la velocidad del programa. Los emuladores de DOS que ejecutan juegos realmente antiguos a veces tienen que acelerar deliberadamente la ejecución de la CPU para que el juego no se actualice a velocidades de cuadro ridículas. –

Cuestiones relacionadas