2011-11-01 14 views
7

C'è un modo semplice di codificare il codice C# JIT in anticipo, piuttosto che attendere la prima volta che il codice viene richiamato? Ho letto di NGEN ma non penso che mi possa aiutare.Evitare l'overhead CIT JIT

La mia applicazione attende e risponde a un evento esterno specifico proveniente da una porta UDP e nessuno del codice del percorso critico è (a) eseguito prima dell'arrivo dell'evento o (b) mai eseguito di nuovo, quindi il costo di JIT è alta in questo scenario. Controllando con il profiler ANTS, il sovraccarico per JIT è intorno al 40-50%, a volte arriva fino al 90%. La mia applicazione è estremamente sensibile alla latenza e ogni millisecondo conta.

Il mio pensiero iniziale è che potrei aggiungere un parametro bool a ogni metodo di percorso critico e chiamare quei metodi prima che si verifichi l'evento, al fine di avviare la compilazione JIT. Tuttavia, c'è un modo più carino e meno hacky?

Molte grazie

+10

Perché NGEN non ti può aiutare? –

+2

Hai determinato che è un problema? O pensi semplicemente che potrebbe essere? –

+0

Sono (praticamente) certo che è il problema Henk. Ho appena implementato su un singolo metodo il mio approccio hacky e l'overhead JIT per quel metodo nel profiler ANTS è scomparso. – endian

risposta

5

Direi di usare NGEN e se non funziona, probabilmente hai problemi più profondi.

Tuttavia, per rispondere alla tua domanda, questo articolo su come utilizza System.Runtime.CompilerServices.RuntimeHelpers.PrepareMethod per forzare un JIT. Include codice di esempio per utilizzare la riflessione per ottenere le maniglie del metodo.

+2

Eccellente, grazie. Ho anche trovato un articolo CodeProject (!) Che avvolge le chiamate PrepareMethod per interi tipi. Link qui: http://www.codeproject.com/KB/dotnet/Jitting.aspx. – endian

3

Cosa succede la seconda volta che arriva l'evento? È più veloce di allora o altrettanto lento. Se è ancora lento, allora JIT non è il problema, perché il codice diventa "JIT" ed una sola volta, la prima volta che viene eseguito.

NGEN fornirebbe la risposta per voi. Il mio suggerimento è di prendere il minimo indispensabile del codice necessario, il percorso critico, se lo si desidera, e inserirlo in un progetto dummy/sandbox. Inizia la profilazione/NGenning di questo codice e vedere la performance.

Se questo codice minimo è nullo, anche se NGEN non funziona correttamente su più chiamate, la pre-compilazione non ti aiuterà. È qualcosa d'altro nel codice che sta causando colli di bottiglia di prestazioni.

+0

Il codice è velocissimo dopo il primo evento.Come ho detto sopra, ho identificato che è sicuramente l'overhead JIT a causare problemi di prestazioni. Sono in procinto di aggiungere un carico di chiamate a RuntimeHelpers.PrepareMethod, si spera che rimuoverà questo problema. – endian