Domanda

Voglio fare alcuni benchmark di un processo C #, ma non voglio usare il tempo come mio vettore - voglio contare il numero di istruzioni IL che vengono eseguite in una particolare chiamata di metodo. È possibile?

Modifica Non intendo l'analisi statica di un corpo del metodo - mi riferisco al numero effettivo di istruzioni eseguite - quindi se, ad esempio, il corpo del metodo include un ciclo, il conteggio verrebbe aumentato da quante istruzioni compongono il ciclo * il numero di volte in cui il ciclo viene ripetuto.

È stato utile?

Soluzione

Non credo sia possibile fare quello che vuoi. Questo perché IL viene utilizzato solo durante la compilazione JIT (Just-In-Time). Quando il metodo è in esecuzione, IL è stato tradotto in codice macchina nativo. Quindi, mentre potrebbe essere possibile contare staticamente il numero di istruzioni IL in un dato metodo / tipo / assembly, non c'è idea di ciò in fase di esecuzione.

Non hai dichiarato la tua intenzione di conoscere il numero di istruzioni IL che sarebbero state interpretate. Dato che esiste solo una libera correlazione tra il conteggio IL di un corpo del metodo e il numero effettivo di istruzioni del codice macchina, non riesco a vedere cosa sapendo raggiungere questo numero (oltre a soddisfare la tua curiosità).

Altri suggerimenti

Beh, non sarà facile. Penso che potresti strumentare il tuo assemblaggio post-compilazione con un codice contatore delle prestazioni eseguito dopo blocchi di IL. Ad esempio, se avessi una sezione di un metodo che ha caricato un int sullo stack e quindi eseguito un metodo statico usando quell'int con codice ottimizzato, puoi registrare un conteggio di 2 per il caricamento e la chiamata int.

Anche usando progetti IL / di lettura / scrittura di assiemi gestiti esistenti, questo sarebbe un compito piuttosto scoraggiante da portare a termine.

Naturalmente, alcune istruzioni che il tuo contatore ha registrato potrebbero essere ottimizzate durante la compilazione just-in-time in x86 / ia64 / x64, ma questo è un rischio che dovresti correre per provare a creare un profilo basato su un linguaggio astratto come IL.

Puoi usare ICorDebug che ha un interfaccia gestita. Inserire un punto di interruzione all'inizio del metodo e passare programmaticamente attraverso il codice fino a quando non lascia il metodo.

Tuttavia, non sono sicuro di quanto utile sarà la metrica, le persone tendono ad usare il tempo per questo tipo di cose. Alcune istruzioni IL sono più costose di altre.

Uso il Metriche del codice a Reflector

  

Il componente aggiuntivo CodeMetrics analizza e   calcola diverse metriche sulla qualità del codice   sulle tue assemblee. Questo componente aggiuntivo utilizza   Riflettore per calcolare le metriche classiche   come complessità ciclomatica o altro   quelli semplici come il   numero di variabili locali in un metodo.   Tutti i risultati possono essere salvati in un file.

Installa il plugin. Seleziona un assieme e carica le metriche del metodo. Ti mostrerà una griglia con CodeSize, CyclomaticComplexity, # of Instruction, ecc.

So che non vuoi il conteggio statico. Tuttavia, il conteggio IL statico per arco, più il numero di volte in cui l'arco è stato eseguito insieme fornisce il conteggio IL. Per questo è necessario strumentare ogni arco, il che richiede l'inserimento di un contatore.

(Un arco è una sequenza di istruzioni che non è possibile saltare dentro o fuori. Se esegui la prima istruzione, eseguirai sempre l'ultima, ecc.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top