2010-06-10 19 views
19

Ho alcuni metodi globali dichiarati in public class nella mia applicazione Web ASP.NET.Static Vs Instance Method Performance C#

ho l'abitudine di dichiarare tutti i metodi globali in classe pubblica nel seguente formato

public static string MethodName(parameters) { } 

Voglio sapere come sarebbe avere un impatto sulle prestazioni punto di vista?

  1. Quale è il migliore? Metodo statico o metodo non statico?
  2. Motivo perché è meglio?

http://bytes.com/topic/c-sharp/answers/231701-static-vs-non-static-function-performance#post947244 stati:

perché, metodi statici stanno usando blocchi per essere thread-safe. Il sempre esegue internamente un Monitor.Enter() e Monitor.exit() per garantire la sicurezza del filo .

Mentre http://dotnetperls.com/static-method stati:

metodi statici sono normalmente più veloce per richiamare sul stack di chiamate di metodi di istanza. Ci sono diversi motivi per questo nel linguaggio di programmazione C# . I metodi di istanza in realtà utilizzano il puntatore di istanza "this" come primo parametro, quindi un metodo di istanza sarà sempre con overhead. I metodi di istanza sono anche implementati con l'istruzione callvirt nella lingua intermedia, che impone un leggero overhead . Ti preghiamo di notare che è improbabile che la modifica dei metodi a metodi statici aiuti molto su obiettivi di prestazioni ambiziosi, ma lo può essere di aiuto in piccola parte e può portare a ulteriori riduzioni.

Sono poco confuso quale usare?

+0

Hai letto fino alla fine di quel primo collegamento? Diventa abbastanza chiaro, anche all'interno del thread, che l'asserzione sul blocco automatico è falsa. –

risposta

42

Il tuo primo link stati:

Questo perché i metodi statici stanno usando blocchi per essere thread-safe. Il sempre fare internamente un Monitor.Enter() e Monitor.Exit() per garantire la sicurezza Thread-

Questo è assolutamente, orribilmente, abominevole sbagliato.


Se si aggiunge [MethodImpl(MethodImplOptions.Synchronized)] al metodo, tale istruzione diventa parzialmente vera.

L'aggiunta di questo attributo farà sì che CLR avvolga i metodi static all'interno di lock(typeof(YourClass)) e i metodi di istanza all'interno di lock(this).

This should be avoided where possible


Il secondo collegamento è corretto.
Static methods are a little bit faster than instance methods, perché non hanno un parametro this (saltando quindi un assegno NullReferenceException dall'istruzione callvirt)

+0

Grazie che è stato utile. – dotnetguts

+9

+1 per gli aggettivi piacevoli :) – SWeko

5

tendo a prendersi cura molto poco di prestazioni a questo riguardo. Quali metodi statici sono davvero utili per implementare le pratiche funzionali. Ad esempio, se si crea un metodo helper statico privato nella classe di istanza, si ha il minimo dubbio che quel metodo non può modificare lo stato dell'istanza.

+0

Ottimo punto. –

0

Questa è fondamentalmente una scelta di design. Se hai una logica che include la creazione di un'istanza di classe e l'aggiornamento di alcune proprietà, vai al metodo di istanza in quanto il metodo statico sarà condiviso tra le istanze. Mentre se hai alcune funzioni di utilità come fare una manipolazione di stringhe, creare una stringa di connessione, ecc. Che non coinvolge la manipolazione dell'oggetto, vai per il metodo statico.

2

Personalmente sceglierei sempre l'approccio migliore per ottenere il tuo compito corrente e scrivere codice stabile, leggibile e di facile manutenzione.

Esistono altri modi per migliorare le prestazioni dell'applicazione.

alcuni esempi:

  • Se si desidera utilizzare un metodo semplice più volte senza istanza di un oggetto ogni volta (una funzione di supporto), quindi utilizzare un metodo statico in una classe statica.

  • Se il metodo accede ad altre variabili nella classe e non è thread-safe, usa la funzione membro.

  • In asp.net se si desidera condividere un oggetto attraverso sessioni o migliorare le prestazioni con un metodo che memorizza internamente il risultato, anche un metodo statico andrebbe bene.

  • È possibile combinare entrambi i modi e utilizzare lo schema di progettazione di fabbrica per disporre di una classe con alcune funzioni membro, ma si garantisce che sia sempre presente una sola istanza alla volta.

  • volte una funzione statica può evitare errori stupidi o riduce la necessità di controlli runtime supplementari:

    String.IsNullOrEmpty(thisstringisnull) // returns true 
    thisstringisnull.IsNullOrEmpty() // If Microsoft would have implemented 
               // the method this way you would get a 
               // NullReferenceException 
    

Ma nel complesso è totalmente dipende l'attività corrente. Non è facile "usa sempre questo approccio ..." rispondi alla tua domanda.

+0

Grazie SchlaWiener per la risposta. Dichiaro metodi di utilità che sono utilizzati molte volte e sono validi da un approccio gestibile, ma sono stato confuso dal blocco del metodo come menzionato in un thread. – dotnetguts

+0

Attualmente è possibile avere metodi di estensione che funzionano con valori null ora, quindi thisstringisnull.IsNullOrEmpty() potrebbe avere senso. – SWeko

+0

@SWeko: davvero? non lo sapevo. È vero per ogni metodo di estensione o devo aggiungere del codice extra se scrivo un metodo di estensione? –