2011-11-15 15 views
6

Un costruttore statico viene eseguito la prima volta che si accede a un membro statico. Sapendo questo, ho diverse domande:Un costruttore statico può ridurre le prestazioni di accesso ai metodi statici?

  • Ciò significa che ogni volta che accedo a un metodo statico, il runtime deve verificare se è stato chiamato il costruttore statico?
  • Questo comporta un calo di prestazioni?
  • Le classi statiche "senza istruttore" evitano questo impatto sulle prestazioni?

[EDIT]: Vorrei chiarire che io non sono preoccupato con micro-ottimizzazione.
Sto facendo questa domanda perché è una decisione design. Se un costruttore statico subisce un calo di prestazioni, quindi progetterò il mio codice con questo in mente e sarà più consapevole delle decisioni che potrebbero influire sulle prestazioni.

Ecco un esempio per illustrare la mia domanda. Ci sarebbe qualche vantaggio nel prendere il metodo Independent e metterlo in una classe statica separata? In questo modo, non avrebbe dovuto verificare se lo statico Test fosse stato inizializzato. [Aggiornamento Vedere la mia risposta qui sotto per un esempio migliore, più semplice].

static class Test { 
    // Static constructor with dependent method: 
    static int x; 
    static Test() { x = 5; } 
    static int Dependent() { return x; } 

    // Static, independent method: 
    static int Independent(int y) { return y+1; } 
} 

Here's the quote dalle specifiche C# per il costruttore statico:

L'esecuzione di un costruttore statico viene attivato dal primo dei seguenti eventi che si verificano all'interno di un dominio di applicazione:

  • Un'istanza della classe viene creata.
  • Viene fatto riferimento a qualsiasi membro statico della classe.
+0

Possibile duplicato: http://stackoverflow.com/questions/2921828/static-constructors-cause-a-performance-over-head –

+0

Ho letto quel post, ma sicuramente differisce dalla mia domanda. Confronta le prestazioni di ** inizializzazione del tipo ** rispetto a ** costruttore statico **. Sono interessato a sapere se l'accesso a un metodo è rallentato da un costruttore statico. Ho riletto il "duplicato", comprese tutte le risposte e i link, e ancora non ho una risposta alla mia domanda! –

+0

Penso che sia sull'accesso al campo e non sulla chiamata al metodo. Ma sì, ci può essere una notevole riduzione delle prestazioni in alcuni scenari. – CodesInChaos

risposta

7

A causa della mancanza di risposte e sotto la direzione di @ Jobo, ho deciso di testarlo da solo.

Qui sono le mie classi di test:

static class WithConstructor { 
    static WithConstructor(){ } 
    public static int Square(int x){ return x*x; } 
} 
static class NoConstructor { 
    public static int Square(int x){ return x*x; } 
} 

compilato per uscita, utilizzando .NET 4.0, i risultati sono stati molto coerenti:

 
╔═════════════╦══════════════════╦═════════╦═══════════════╗ 
║ Iterations: ║ With Constructor ║ 4513 ms ║ Improvement: ║ 
║ 1000000000 ║ No Constructor ║ 3072 ms ║ 33%   ║ 
╚═════════════╩══════════════════╩═════════╩═══════════════╝ 

Pertanto, ho intenzione di rispondere alle mie domande:

  • Se esiste un costruttore statico, quindi un metodo statico incorrerà in una (microscopica) colpo di prestazioni, perché il flag beforefieldinit deve sempre essere controllato.

  • Se un costruttore statico non esiste, il metodo non causerà il colpo di prestazioni.

2

Perché non testarlo da solo?

Chiama il tuo metodo indipendente un numero di volte come specificato sopra. Quindi creare una propria classe statica con lo stesso metodo e chiamarla lo stesso numero di volte.

Utilizzare http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx per la misurazione.

La mia ipotesi è che significa meno importa ...

Si potrebbe anche scrivere qualcosa per la vostra console costruttore statico per verificare se erano stati chiamati. Scoprire da solo durerà più a lungo di qualche risposta teorica, solo i miei 2 centesimi.

+0

Penso che lo farò. Sono davvero sorpreso che non ci sia una risposta ben nota. –

+0

@Scott non c'è una risposta ben nota perché questo probabilmente non è un collo di bottiglia per nessuno. C'è anche una possibilità che rimuova il costruttore e invece il valore predefinito di X a 5. – Rangoric

+0

@Rangoric Non ho menzionato questo nel mio OP (è lì ora), ma non sono interessato alla performance come sono nelle decisioni di progettazione. Quando si progetta un metodo statico, è sicuramente utile capire i possibili risultati delle prestazioni e, in questo caso, avere un buon modello di progettazione aiuterà a evitare questi colpi. –

0

Il costruttore statico può ridurre le prestazioni del primo chiamante metodo. Indead, il primo chiamante viene modificato per verificare se il costruttore statico è già stato chiamato ma altro chiamante se non è interessato.

Problemi correlati