2015-04-10 25 views
11

Sulla base della ricca ricchezza dello stackoverflow, ho ottenuto e ricevuto risposte sul fatto che l'ottimizzazione ricorsiva della coda sia eseguita specificamente per il codice C#. Alcune delle domande sembravano parlareCompilazione C# con ottimizzazione ricorsiva della coda?

  1. Speculazione dell'ottimizzazione nelle versioni più recenti di .NET che venivano rilasciati
  2. domanda di costruzione come applicazione x64bit per raggiungere l'ottimizzazione
  3. Il passaggio da una build di debug a una versione build in Visual Studio per ottenere l'ottimizzazione
  4. Nessuna ottimizzazione e la comunità microsoft ha affermato che non eseguirà l'ottimizzazione ricorsiva della coda per "problemi di sicurezza" (non l'ha davvero capita)
  5. È successo ns da casuale

Così come di C# 4.0 (Visual Studio 2013/2015) Come si fa a garantire la coda di ottimizzazione ricorsiva se così si può garantire a tutti?

+3

Generalmente aggiunge molto valore a questi post quando si collegano le altre domande e le risposte che si sono incontrate in modo da poter seguire il proprio treno di pensiero e percorso che hai intrapreso per raggiungere la tua domanda. –

+1

La versione corrente di C# è 5, la versione 6 è disponibile nelle anteprime VS 2015. –

+0

@TravisJ Stavo per provare a collegare le altre domande, ma non ero sicuro di poterle rintracciare b/c. Li ho visti per un periodo di tempo significativo. –

risposta

19

Ci sono diversi livelli in cui è possibile supportare l'ottimizzazione della chiamata di coda. Il JIT è davvero responsabile di molte ottimizzazioni che avvengono. Il compilatore C# non esegue nemmeno la funzione di inlining, cioè la responsabilità del compilatore JIT. Il compilatore C# potrebbe utilizzare lo Tailcall IL opcode che designa una chiamata come coda, tuttavia credo che nessuna versione del compilatore C# lo faccia. Il compilatore JIT è autorizzato a effettuare ottimizzazioni di chiamata tail quando lo ritiene opportuno. In particolare, credo che solo il JIT a 64 bit lo fa. Questo blog post delinea una serie di scenari in cui JIT64 non può utilizzare l'ottimizzazione delle chiamate tail. Sono sicuro che i criteri potrebbero essere soggetti a modifiche poiché stanno lavorando a una riscrittura del compilatore JIT, nome in codice RyuJIT.

Se volete un breve esempio di programma che può utilizzare TCO provare questo:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Test(1); 
    } 

    private static void Test(int i) 
    { 
     Console.WriteLine(i); 
     Test(i + 1); 
    } 
} 

Impostare il progetto per la costruzione di rilascio/x64 (o AnyCPU w/o preferire a 32-bit) e iniziare senza il debugger allegato. Il programma funzionerà per sempre. Se non eseguo tutte queste operazioni, ottengo un'eccezione StackOverflow intorno al 20947.

+1

Il secondo link si riferisce come il primo. Intendevi questo? http://blogs.msdn.com/b/clrcodegeneration/archive/2009/05/11/tail-call-improvements-in-net-framework-4.aspx Inoltre, buon post: http://stackoverflow.com/ domande/15864670/generate-tail-call-opcode –

+0

@ Erti-ChrisEelmaa Risolto il collegamento, a cui si fa riferimento anche nel post a cui si è collegati. –

+0

Quindi, per garantire che ci sia una probabilità di ottimizzazione ricorsiva della coda da parte del compilatore JIT, impostarlo su 64 bit? Inoltre, c'è qualcosa di immediato (parole chiave, tag attributi) che si potrebbe aggiungere per aumentare la probabilità di ottimizzazione? –

Problemi correlati