2010-02-16 5 views
41

Ich nehme an, dass public oder privatestatic Ziele Speicherverbrauch reduziert haben müssen, aufgrund der Tatsache, dass nur eine Kopie des statischen Ziels im Speicher ist.Sind C# statische Funktionen besser als nicht statische Funktionen, abgesehen von einer reduzierten Speichernutzung?

Es scheint so, als ob eine Methode statisch ist, was die Methode zu einem möglichen Punkt für die weitere Optimierung durch den CLR-Compiler macht, jenseits dessen, was mit einer nicht statischen Funktion möglich ist. Nur eine schwache Theorie, also bin ich gekommen, um euch alle zu fragen.

Haben staticpublic oder private Methoden einen höheren Leistungsvorteil als nur eine verringerte Speichernutzung?

(Anmerkung: Ich interessiere mich nicht für Antworten, die über die Probleme der vorzeitigen Optimierung sprechen. Sicher ist das ein guter Ratschlag, den ich jeden Tag befolge, aber das bedeutet nicht, dass Optimierung manchmal nicht nötig ist. (Doppelt negativ!) Erlauben ich meine Neugier gönnen, am wenigsten)

+3

in C# sie heißen Methoden nicht Funktionen :) –

Antwort

51

Von Static Classes and Static Class Members (C# Programming Guide)

ein Aufruf einer statischen Methode erzeugt einen Aufrufbefehl in Microsoft Zwischensprache (MSIL), während einen Anruf zu einer Instanzmethode generiert a callvirt-Anweisung, die auch auf Null Objektreferenzen prüft. Meistens ist jedoch der Leistungsunterschied zwischen den beiden nicht signifikant.

+13

Auf modernen Architekturen isst der Verzweigungsprädiktor den Null-Check mit fast Null Overhead. –

+0

@ 280Z28 Nun, um einige moderne Plattformen genau zu sein (PlayStation 3 tut dies, wenn mein Gedächtnis mir gut hilft) beseitigen Zweig Vorhersage bessere Leistung für die Kosten von schwieriger zu schreiben Programme –

+1

@Rune FS: Auf ARM sind die Prüfungen mit bedingt implementiert Anweisungen ausgeführt. Auf der SPU der Zelle gibt es keine Verzweigungsvorhersage, aber aufgrund mehrerer anderer Bedenken sollten Sie, wenn Sie vorhaben, verwalteten Code auf der SPU auszuführen, hauptsächlich mit Nicht-Null-Typen arbeiten. Ich habe tatsächlich eine konzeptionelle JIT für die SPU geschrieben, die sich auf eine kleine Anzahl von Datentypen konzentriert hat, die für High-Performance Computing nützlich sind, und Laufzeit-Null-Referenz-Checks zugunsten der statischen Analyse ausgelassen hat (die Contracts-Bibliothek). –

23

Abgesehen von dem, was Astander gesagt hat, deutet Ihre Frage auf ein Missverständnis darüber hin, was Instanzmethoden tun. Unabhängig davon, ob die Funktion statisch ist oder nicht, gibt es nur eine Kopie des Funktionscodes im Speicher. Eine nicht statische Methode muss über ein Objekt aufgerufen werden, das Objekt enthält jedoch keine eigene Kopie der Methode. So ist die Speichernutzung von statischen und nicht statischen Methoden tatsächlich identisch, und wie andere darauf hingewiesen haben, sind die Leistungsmerkmale nahezu identisch.

Nicht statische Mitgliedsvariablen sind jedoch für jedes von Ihnen erstellte Objekt separat vorhanden. Aber es ist fast immer eine Verschwendung von Zeit, sich um die Speichernutzung zu sorgen, es sei denn, Sie haben tatsächlich ein speicherbezogenes Problem in Ihrem Programm.

+0

"Unabhängig davon, ob die Funktion statisch ist oder nicht, es gibt nur eine Kopie des Funktionscodes im Speicher." Danke, das wusste ich sicher nicht. –

+3

Bei einer nicht statischen Methode wird "this" als ausgeblendeter Parameter übergeben, damit jemand behaupten kann, dass er mehr Stapelspeicherplatz benötigt. Dies scheint jedoch nicht besonders wichtig. –

+1

@Steven - Wenn Sie die Methode in eine statische konvertiert haben, müsste sie einen expliziten 'this' Parameter haben. –

0

MeasureIt um sicher zu sein, aber Sie werden finden, wenn Sie eine Welt umspannende Ultra-High-Volume-Transaktionsverarbeitung Supercomputing-Cluster erstellen, wird es keinen nennenswerten Unterschied haben.

1

Gute Antworten - im Grunde spielt es keine Rolle, welches die Antwort auf fast jede Frage dieser Art ist. Auch wenn es einen Unterschied machen würde - Wenn die Ausführungszeit Ihres Programms einen Dollar kostet, kostet diese Art von Problem wahrscheinlich einen Bruchteil von einem Cent, und es ist sehr wahrscheinlich, dass es andere Dinge gibt costing a great deal more.

17

Dies ist ein wenig off-topic, aber nicht weniger wichtig.

Die Wahl der Methoden statische oder Instanz machen sollte nicht auf die Ausführungszeit basieren (die nicht an die Materie ohnehin scheint). Es sollte darauf basieren, ob die Methode auf einem Objekt funktioniert. Zum Beispiel alle Math.* Methoden sind statisch, während z.B. (Most) String. * Methoden sind Instanzen, da sie auf einer String-Instanz arbeiten. Meine persönliche Philosophie: ein gutes Design sollte die wenigen Zyklen ausgleichen, die anderswo gespeichert werden können.

Eine andere Sicht auf das Thema: Ich habe vor kurzem mit einem Typen gearbeitet, dem gesagt wurde, dass statische Methoden böse sind, weil sie uns zurück ins dunkle Zeitalter der prozeduralen Programmierung bringen und somit um jeden Preis vermieden werden sollen. Dies führte zu merkwürdigen Beispielen von Klassen, die Instanzen für den Zugriff auf Methoden benötigten, die absolut kein Interesse an den Interna des Objekts hatten.

Puh, es fühlte sich gut an, das von meinem Herd zu bekommen.

+6

Einfache Regel: Wenn eine Methode oder Eigenschaft nicht auf einen Instanzstatus ('this' und seine Member) zugreift, sollte dieser wahrscheinlich statisch sein. –

+6

-1 weil ich die Leute satt habe, die legitime Optimierungs-/Leistungsfragen haben, die einfach gesagt werden "mach es nicht". Manchmal sind Mikrooptimierungen ** wichtig. – dsimcha

+0

Gelegentlich möchte ich kleine private statische Funktionen in nicht statischen Klassen verwenden, so dass ich anhand des Schlüsselworts erkennen kann, dass die Methode nicht nicht-statische Instanzvariablen direkt ändert. Aber normalerweise füge ich nur das Schlüsselwort static hinzu, wenn die Methode anfänglich keine Instanzvariable berührt. –