2009-03-16 10 views
8

Desidero conoscere queste informazioni per ridurre le dimensioni del mio codice, quindi non perderò tempo a ottimizzare le cose che verranno eseguite dal compilatore o dal JIT.A quale livello C# compiler o JIT ottimizza il codice dell'applicazione?

ad esempio:

Se assumiamo la linea compilatore la chiamata alla funzione get di una proprietà in modo da non dover salvare il valore di ritorno in una variabile locale per evitare chiamata di funzione.

Desidero raccomandare un buon riferimento che descriva cosa sta succedendo?

risposta

18

Si consiglia di dare un'occhiata a questi articoli:

JIT Optimizations - (Sasha Goldshtein - CodeProject)
Jit Optimizations: Inlining I (David Notario)
Jit Optimizations: Inlining II (David Notario)

Per essere onesti non si dovrebbe essere preoccuparsi troppo di questo livello di micro-dettagli. Lascia che il compilatore/JIT ti preoccupi di questo per te, è meglio che tu sia in quasi tutti i casi. Non rimanere bloccato su Premature Optimisation.Concentrati sull'ottenere il tuo codice funzionante, quindi preoccuparti delle ottimizzazioni in seguito se (a) non funziona abbastanza velocemente, (b) hai problemi di "dimensione".

17

Se si è preoccupati per le prestazioni, eseguire un profiler. Quindi cambia codice. È probabile che in un milione di anni non riuscirai mai a indovinare al 100% correttamente dove sta andando il momento. Potresti cambiare il timing dello 0,02% e lasciare il metodo che contribuisce al 62% del carico. Potresti anche peggiorare la situazione. Senza un profiler e prove, sei cieco.


Non può assumere che il JIT sarà inline un getter proprietà. Ci sono molte ragioni per cui può o non può farlo; dimensione del corpo del metodo, virtuale, valore vs tipo di riferimento, architettura, debugger, ecc

"sollevamento" ha ancora un posto, e può ancora ottenere risparmi se il codice viene chiamato ripetutamente in un ciclo stretto; per esempio:

var count = list.Count; 
for(int i = 0 ; i < count ; i++) {...} 

(dimentichiamo la for vs foreach dibattito fr quanto sopra - si tratta di una discussione ortogonale). In quanto sopra, il "paranco" aiuterà le prestazioni. Ma solo per essere davvero confondere - con gli array, è il contrario, ed è più efficiente per non paranco è:

for(int i = 0 ; i < arr.Length ; i++) {...} 

Il JIT riconosce e rimuove il controllo limiti (come array sono fissati dimensione).

+0

Non sapevo di quello ultimo! Bello sapere, grazie! – Groo

+0

Grazie per le informazioni, ma sto chiedendo un buon riferimento per queste informazioni –

+2

Il mio punto è che * nessun * riferimento ti aiuterà veramente con questo. A ** profiler ** lo farà. –

1

Questo sembra un tipo di micro ottimizzazione che non dovresti guardare. Se non sbaglio, dipende dall'architettura e dalla versione del CLR che tipo di ottimizzazione viene applicata.

Se il tuo metodo è chiamato così tanto, e tu davvero lo vuoi in linea, puoi inserirlo direttamente al costo del codice spaghetti.

Si consiglia di analizzare il proprio algoritmo, in linea un metodo non salverà grandezze di velocità, mentre un algoritmo migliore può far diminuire il tempo di esecuzione da ore a secondi.

-1

L'ottimizzazione più potente eseguita da un JIT è in genere inlining. Un JIT può persino integrare in profondità centinaia di funzioni (ho sentito questa figura per JikesRVM). Inseriranno anche inline le cose che non sono sempre possibili da allineare, e lo restituiranno in un secondo momento se necessario (chiamato deoptimizzazione dinamica).

Una bella panoramica è http://java.sun.com/products/hotspot/docs/whitepaper/Java_Hotspot_v1.4.1/Java_HSpot_WP_v1.4.1_1002_4.html.

Per la tua domanda specifica, direi probabilmente, se la chiamata di funzione in questione è hot.

Problemi correlati