Vuoi conoscere i problemi di prestazioni dei tipi di classe e dei modificatori di accesso

2

Qualcuno mi ha suggerito di contrassegnare le classi come SIGILLATE che non vengono ereditate da nessuna parte. Stavo usando lo stile di default e non ero interessato al tipo di classe. Al momento non ho uno strumento di benchmark per studiare i guadagni in termini di prestazioni, ma ho letto da qualche parte che le Sealed Classes offrono vantaggi in termini di prestazioni.

Questo problema di prestazioni è applicabile ad altri tipi di classe come: Astratto, Statico, Nuovo ecc. e anche con modificatori di accesso come pubblico, protetto, interno, protetto-interno e virtuale?

Se fa differenza nelle prestazioni, quale tipo di ottimizzazione viene eseguita internamente?

    
posta RPK 06.08.2011 - 13:55
fonte

3 risposte

2

Sì, l'uso di classi sigillate, oltre a vantaggi significativi in termini di progettazione, può offrire alcuni vantaggi in termini di prestazioni.

I vantaggi del design (che tu dici di non essere interessati, ma includerò qui per una risposta completa) sono che puoi evitare Fragile classe base problema. Il che, in breve, significa che una modifica futura a una classe base può causare problemi se le cose non sono contrassegnate sealed .

Come indicato nel link che hai pubblicato : "Sealing i metodi virtuali li rende candidati per l'inlining e altre ottimizzazioni del compilatore" e "i membri virtuali ... sono più costosi da chiamare a causa di una ricerca di tabelle virtuali".

.NET framework fa ogni tentativo di ottimizzare l'invio virtuale, quindi le chiamate alle funzioni virtuali non sono affatto costose, ma sono un po 'più lente di una chiamata di funzione diretta o, meglio ancora, di una funzione in linea. Questo overhead aggiuntivo è significativo solo se la funzione che si sta chiamando è estremamente breve (ad esempio, non itera sui dati) e se la chiamata alla funzione è all'interno di un ciclo.

Se vuoi informazioni dettagliate su quanto è più lenta una chiamata di funzione virtuale, considera questo link .

Come per le altre parole chiave:

Le funzioni

statiche non sono sovrascrivibili, quindi sono le stesse prestazioni di sealed . Tutto il resto non farà la differenza nell'esecuzione della tua classe. Tuttavia, come il link afferma, le scelte di progettazione di campi e metodi possono (ad esempio, i campi volatili sono più lenti).

    
risposta data 06.09.2011 - 03:56
fonte
6

Secondo me questa è una questione di design, non di prestazioni. Se vuoi impedire che la classe venga ereditata, contrassegnala come sigillata: dovresti farlo solo se hai una buona ragione per farlo, altrimenti potresti potenzialmente porre delle restrizioni artificiali sul futuro design del sistema.

Qualsiasi domanda relativa ai problemi di rendimento relativi ai modificatori di classe mi sembra straordinariamente marginale (ma vedi link ) ed è improbabile che faccia la differenza nella vita reale.

In effetti, andrei oltre e direi che suona davvero come l'ottimizzazione prematura. Hai qualche performance / test che ti suggerisce di BISOGNO di migliorare le prestazioni? Se no (e presumo di no), allora non mi preoccuperei molto di questo - se tu fai e questo fa la differenza, per favore faccelo sapere: -)

    
risposta data 06.08.2011 - 14:13
fonte
0

Non so se ci sia una differenza di performance rendendo una classe sigillata, e dubito che ci sia, e se c'è qualche differenza, non è certamente significativa.

Lo stesso vale per qualsiasi altro modificatore. Il modificatore static , ad esempio, limita l'uso di metodi statici e un metodo statico non ha bisogno di un riferimento di istanza passato, in modo che teoricamente dia un guadagno di prestazioni molto basso. In pratica non è sicuro che ci sia alcuna differenza di perforazione, e se ce n'è una, è così piccola che è molto difficile persino misurarla.

Dovresti usare i modificatori che ti danno il comportamento che vuoi, non provare a usarlo per influenzare le prestazioni. Ci sono sicuramente altri modi per dare al codice un guadagno di prestazioni molto più grande se è quello che stai cercando.

    
risposta data 06.08.2011 - 14:01
fonte

Leggi altre domande sui tag