Statische Vs-Instanz-Methode Performance C#
Ich habe einige global deklarierten Methoden in der öffentlichkeit in meiner Klasse ASP.NET web-Anwendung.
Ich habe die Angewohnheit, deklarieren Sie alle globalen Methoden in der public-Klasse im folgenden format
public static string MethodName(parameters) { }
Möchte ich wissen, wie wäre es Auswirkungen auf die performance-Sicht?
- Welches ist besser? Statische Methode oder Nicht-Statische Methode?
- Grund, warum es besser ist?
http://bytes.com/topic/c-sharp/answers/231701-static-vs-non-static-function-performance#post947244 Staaten:
weil statische Methoden werden mit sperren werden, um Thread-sicher. Die immer
machen intern einen Monitor.Geben Sie() und Monitor.exit (), um sicherzustellen,
Thread-Sicherheit.
Während http://dotnetperls.com/static-method Staaten:
statische Methoden sind normalerweise schneller aufrufen auf den call-stack als
Instanz-Methoden. Es gibt mehrere Gründe für diese in C#
Programmiersprache. Instanz-Methoden nutzen 'dieser'
Instanz-Zeiger als ersten parameter, so wird eine Instanz-Methode
immer dieser Aufwand. Instanz-Methoden sind auch implementiert
der callvirt-Anweisung in die intermediate language, die erlegt eine
leichte overhead. Bitte beachten Sie, dass ändern Sie Ihre Methoden, um statischen
Methoden ist unwahrscheinlich, um zu helfen viel auf ehrgeizige Ziele, aber
es kann helfen, ein kleines bisschen und möglicherweise führen zu weiteren Kürzungen.
Ich bin etwas verwirrt, die man zu nutzen?
- Hast du gelesen, um das Ende des ersten link? Es wird Recht deutlich, sogar innerhalb des thread, dass die Aussage über die automatische Verriegelung ist falsch.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Deinem ersten link states:
, Dass ist absolut, schrecklich, bestialisch falsch.
Wenn Sie hinzufügen
[MethodImpl(MethodImplOptions.Synchronized)]
zu der Methode, die Anweisung wird nur teilweise wahr.Hinzufügen dieses Attributs verursacht, dass die CLR wrap
static
Methoden imlock(typeof(YourClass))
- und Instanz-Methoden innerhalb derlock(this)
.Dies sollte vermieden werden, wo möglich
Ihre zweite link ist korrekt.
Statische Methoden sind ein wenig schneller als Instanz-Methoden, weil Sie nicht haben eine
this
parameter (also das überspringen einerNullReferenceException
Scheck von der callvirt-Anweisung)Tendiere ich zur Pflege sehr wenig über die Leistung in dieser Hinsicht. Was statische Methoden sind wirklich sinnvoll für die Durchsetzung der funktionalen practices. Zum Beispiel, wenn Sie erstellen eine private statische Hilfsmethode in die Instanz der Klasse hast du das Stück des Geistes zu wissen, dass diese Methode nicht ändern Sie den Status der Instanz.
Ich persönlich würde immer den Ansatz wählen, dass ist besser für achiving Ihre aktuelle Aufgabe und schreiben Sie stabil, gut lesbar und leicht zu pflegen-code.
Gibt es andere Möglichkeiten zur Verbesserung der Leistung Ihrer Anwendung.
einige Beispiele:
Wenn Sie möchten, verwenden Sie eine einfache Methode mehrere Male ohne Instanzierung ein Objekt jeder Zeit (eine helper-Funktion), dann verwenden Sie eine statische Methode in einer statischen Klasse.
Wenn Ihre Methode greift auf andere Variablen in der Klasse und ist nicht thread-sichere Verwendung von s-member-Funktion.
In asp.net wenn Sie möchten, zu teilen ein Objekt zwischen Sitzungen oder Sie können die Leistung verbessern, mit einer Methode, die intern speichert das Ergebnis eine statische Methode wäre in Ordnung, zu.
Können Sie eine Kombination beider Wege und die factory-design-pattern, um eine Klasse mit einigen member-Funktionen, aber Sie sorgen dafür, dass es immer nur eine Instanz gleichzeitig.
Manchmal eine statische Funktion können Sie vermeiden, dumme Fehler oder reduziert die Notwendigkeit von zusätzlichen Prüfungen zur Laufzeit:
Aber insgesamt ist es völlig abhängig von der aktuellen Aufgabe. Es gibt keine einfache "immer mit diesem Ansatz..." die Antwort auf Ihre Frage.
Dies ist im Grunde eine design-Wahl. Wenn Sie Logik, die das erstellen Instanz der Klasse und Aktualisierung einige Eigenschaften, gehen Sie für die Instanz-Methode als statische Methode wird über mehrere Instanzen. Während, wenn Sie haben einige utility-Funktionen, wie dabei einige string-manipulation, erstellen einer Verbindungszeichenfolge etc.., die nicht die Objektmanipulation, gehen für statische Methode.