Warm-up quando si chiamano i metodi in C #

Ho appena scoperto questo post che parla della misurazione del tempo. Ricordo (spero di non essere in errore) è una competizione sleale, se questo metodo non viene mai chiamato prima. Questo è:

// At the beginning of the application MyClass instance = new MyClass(); instance.MyMethod(); instance.MyMethod(); // Faster than the first call, because now it's warmed up. 

Abbiamo davvero una teoria del riscaldamento in C #? Se sì, perché (cosa farà il CLR durante il riscaldamento)? Ed è tutto uguale se questo metodo è un’estensione (uno statico)?

Se per “riscaldamento” si fa riferimento a JIT’ing allora sì – se un metodo non viene mai chiamato non sarà ancora stato compilato, quindi la prima volta che lo si esegue potrebbe essere più lento. Fai anche riferimento a .NET CLR JIT compila ogni metodo ogni volta?

Ciò è dovuto alla compilazione just-in-time (JIT). Se vuoi migliorare le prestazioni ed evitare questo effetto, Native Image Generator (Ngen.exe) può aiutarti.

Ciò di cui le persone stanno parlando qui è la compilazione just-in-time . Il codice che crei in .NET è memorizzato in linguaggio intermedio, che è indipendente dalla piattaforma. Quando si eseguono le parti dell’applicazione del codice CIL , vengono compilate istruzioni specifiche della piattaforma che impiegano un po ‘di tempo per la prima volta. Quindi viene memorizzato nella cache così la prossima volta che chiami il metodo non hai questa perdita di tempo.

Se lo desideri, puoi comunque pre-compilare versioni specifiche per piattaforma.

Ha bisogno di essere compilato, ed è per questo che la prima chiamata è più lunga.

Dalla compilazione di MSIL al codice nativo :

Alla chiamata iniziale al metodo, lo stub passa il controllo al compilatore JIT, che converte l’MSIL per quel metodo in codice nativo e modifica lo stub per dirigere l’esecuzione nella posizione del codice nativo. Le chiamate successive del metodo compilato JIT procedono direttamente al codice nativo precedentemente generato, riducendo il tempo necessario per compilare JIT ed eseguire il codice.