Domanda

Voglio sapere queste informazioni per ridurre le dimensioni del mio codice in modo da non perdere tempo a ottimizzare le cose che verranno eseguite dal compilatore o da JIT.

ad esempio:

se supponiamo che il compilatore inserisca la chiamata nella funzione get di una proprietà, quindi non devo salvare il valore restituito in una variabile locale per evitare la chiamata di funzione.

Voglio raccomandare un buon riferimento che descriva cosa sta succedendo?

È stato utile?

Soluzione

Potresti dare un'occhiata a questi articoli:

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

Ad essere onesti, non dovresti preoccuparti troppo di questo livello di micro-dettaglio. Lascia che il compilatore / JIT si preoccupi di questo per te, è meglio di quello che sei in quasi tutti i casi. Non rimanere bloccato su Ottimizzazione precoce . Concentrati su come far funzionare il tuo codice, poi preoccupati delle ottimizzazioni in seguito se (a) non funziona abbastanza velocemente, (b) hai problemi di "dimensione".

Altri suggerimenti

Se sei preoccupato per le prestazioni, esegui un profiler. Quindi cambia codice. È probabile che in un milione di anni non indovinerai mai correttamente al 100% dove sta andando il tempo. Potresti cambiare il tempismo dello 0,02% e abbandonare il metodo che contribuisce al 62% dell'onere. Potresti anche peggiorare le cose. Senza un profiler e prove, sei cieco.


Non puoi presumere che JIT inserirà un getter di proprietà. Ci sono molte ragioni per cui può o meno farlo; dimensione del corpo del metodo, virtuale, valore vs tipo di riferimento, architettura, debugger collegato, ecc.

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

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

(dimentica il dibattito per vs foreach di cui sopra - questa è una discussione ortogonale). In quanto sopra, il "paranco" aiuterà le prestazioni. Ma solo per essere davvero confuso - con gli array, è il contrario ed è più efficiente non sollevarlo:

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

Il JIT lo riconosce e rimuove il controllo dei limiti (poiché le matrici hanno dimensioni fisse).

Sembra una sorta 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 vuoi che sia integrato, puoi incorporarlo tu stesso al costo del codice spaghetti.

Vorrei raccomandare di analizzare il tuo algoritmo, per incorporare un metodo non risparmierai magnitudini di velocità, mentre un algoritmo migliore può far diminuire il tuo tempo di funzionamento da ore a secondi.

L'ottimizzazione più potente eseguita da un JIT è in genere in linea. Una JIT può persino incorporare centinaia di funzioni in profondità (ho sentito questa figura per JikesRVM). Includeranno persino le cose che non è sempre possibile incorporare e, se necessario, lo riporteranno in seguito (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 .

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