2011-09-02 14 views
11

un follow-up a Does .NET JIT optimize empty loops away?:C'è un modo per ottenere il compilatore .Net JIT o C# per ottimizzare i cicli di apertura a vuoto?

Il seguente programma appena viene eseguito un loop vuoto un miliardo di volte e stampa il tempo di correre. Ci vogliono 700 ms sulla mia macchina, e sono curioso di sapere se c'è un modo per far sì che il jitter ottimizzi il ciclo vuoto.

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

Per quanto posso dire la risposta è no, ma non so se ci sono opzioni di compilazione nascoste forse non avrei provato. Ho fatto in modo di compilare in modalità di rilascio ed eseguire senza debugger collegato, ma sono ancora in corso 700 ms per eseguire questo ciclo vuoto. Ho anche provato NGEN con lo stesso risultato (anche se la mia comprensione è che dovrebbe comunque produrre lo stesso codice compilato del JIT, giusto?). Comunque non ho mai usato NGEN prima e forse lo sto usando male.

E Sembra come questo sarebbe qualcosa di facile per il JIT per trovare e ottimizzare via, ma conoscendo molto poco su come nervosismi lavoro in generale, io sono curioso di sapere se c'è un motivo specifico questa ottimizzazione sarebbe stato lasciato fuori . Anche il compilatore VC++ sembra davvero fare questa ottimizzazione, quindi mi chiedo perché la discrepanza. Qualche idea?

+6

Perché questo è un problema per te in realtà? Se hai un ciclo vuoto, liberati di esso. –

+0

Com'è diverso dalla domanda a cui fai riferimento? –

+0

@Reed so che java ha opzioni JIT come server e client. La domanda di riferimento non chiede nulla sulle opzioni che possono indurre il jitter a ottimizzarlo. –

risposta

7

No, nessuno dei jitter .NET che conosco elimina i loop vuoti. Il motivo esatto per cui non è chiaro per me, l'ottimizzatore di jitter certamente sa come fare ottimizzazioni come quella e prontamente elimina il codice morto. Controlla this answer per i dettagli. Credo che questo sia stato intenzionale, lasciando il ciclo in atto per il suo possibile effetto collaterale, consumando tempo. Che naturalmente ha senso solo per cicli molto brevi per implementare uno spinwait.

+3

Questa è una specie di logica strana. L'intero punto nell'ottimizzazione del codice è di far consumare meno tempo.Se si decide di conservare la quantità di tempo trascorso, questo mina l'intera idea di ottimizzazione. – jalf

+4

Uno spinwait è un'ottimizzazione. –

+0

La visualizzazione del ciclo vuoto mi ricorda i programmi DOS obsoleti scritti male che utilizzavano cicli vuoti per introdurre ritardi o dipendevano dal tempo della CPU per imporre la velocità del programma. Gli emulatori DOS che eseguono giochi molto vecchi a volte devono limitare volutamente l'esecuzione della CPU in modo che il gioco non si aggiorni a frame rate ridicoli. –

Problemi correlati