2009-03-14 11 views
12

Kann C# inline auf Eigenschaften zugreifen? Ich kenne die 32-Byte-Grenze (Anweisung?) Auf dem JIT für Inlining, aber wird es Inline-Eigenschaften oder nur reine Methodenaufrufe?Sind C# Inline-Eigenschaften?

Antwort

24

Es hängt vom JIT ab (der C# -Compiler macht, soweit ich weiß, keinerlei Inlining), aber ich glaube, dass das JIT in den meisten Fällen triviale Eigenschaften enthält.

beachte, dass es wird nicht inline Mitglieder von Typen von MarshalByRefObject Herleiten der System.Windows.Forms.Control (via System.ComponentModel.Component) umfasst.

Ich habe auch gesehen, double Felder am Ende wird weniger effizient, wenn über Eigenschaften zugegriffen - es könnte sein, dass es einige Feinheiten um das sind (aufgrund der Registrierung verwenden usw.).

Beachten Sie auch, dass die 64-Bit- und 32-Bit-JITs unterschiedlich sind, einschließlich ihrer Behandlung dessen, was inline wird.

EDIT: Ich habe gerade eine 2004 blog entry von David Notario mit ein paar mehr Informationen gefunden. Allerdings war das vor 2.0 ausgeliefert - ich wäre nicht überrascht zu sehen, dass sich zumindest einiges davon geändert hat. Könnte sowieso interessant sein.

EDIT: Another question bezogen auf eine 2008 Vance Morrison blog entry, die weitere Informationen gibt. Interessantes Zeug.

+0

Bemerkenswert eine Eigenschaft ist ein Wrapper um ein oder zwei (get_Name, set_Name) Funktionen. So ist das Inlining von Eigenschaften eine minimale Erweiterung gegenüber dem Inlining von Funktionen. – Richard

8

Eine Eigenschaft Zugriff ist nur eine reine Methodenaufruf. Es gibt keinen Unterschied in der IL, die der Compiler für einen Eigenschaftenzugriff und für einen Methodenaufruf mit einer ähnlichen Signatur ausgibt, welche Art von Antworten Ihre Frage beantwortet.

+0

Während ich dem allgemeinen Prinzip zustimme, gibt es * einen Unterschied in IL auf der * property * -Seite ... das JIT kann sicherlich "wissen", dass das, was aufgerufen wird, ein Eigentums-Mitglied ist, also könnte es sich entschließen, es nicht zu tun JIT basierend auf diesen Informationen. Es wäre allerdings merkwürdig, das zu tun, IMO. –

+0

Ja, die Zugriffsmethoden sind mit dem Flag 'specialname' gekennzeichnet und ihre Namen sind standardisiert.OTOH, Methoden, die eine spezielle Behandlung von CLR erhalten sollen (wie Konstruktoren), sind mit "rtspecialname" gekennzeichnet, so dass die Behandlung von Accessoren anders wäre gegen den Geist des CLI/CLR-Standards. –

5

Es hat eine Weile gedauert, bis ich herausgefunden habe, dass in Visual Studio die Disassemblierung von verwaltetem Code angezeigt werden kann, nach der JIT kompiliert es.

Warum also nicht eine Klasse mit einer sehr einfachen Accessor-Eigenschaft erstellen, sie im Freigabemodus ausführen, einen Haltepunkt setzen und sehen, was die Disassemblierung sagt?

+3

Warum erzählst du uns nicht, wie das geht, wenn du (wie du sagst) eine Weile gebraucht hast, um das herauszufinden? –

+0

Schritt oder brechen Sie in den Code und öffnen Sie das Disassembly-Fenster. –

+6

Wenn Sie unter dem Debugger Code für den Freigabemodus ausführen, wird die Ausführung unter dem Deugger JIT-Optimierungen wahrscheinlich deaktivieren! Stattdessen müssen Sie es ohne den Debugger starten, lassen Sie es JIT, und verwenden Sie dann den Debugger, um den bereits laufenden Prozess anzuhängen (und * dann * das Disassembly-Fenster zu öffnen). – ChrisW

4

gab ich eine ähnliche Frage vor kurzem:

Why are public fields faster than properties?

Das Problem mit mir war, dass ein öffentlicher Bereich war schneller als eine Eigenschaft, weil ich 64-Bit-Vista läuft und der JIT zu meinem Code kompiliert 64-Bit auch, und meine Eigenschaften waren nicht in-lined. Durch das Erzwingen, dass das Projekt für x86 kompiliert wird, wurde die Eigenschaft inline eingefügt und es gab keine Geschwindigkeitsdifferenz zwischen der Eigenschaft und dem öffentlichen Feld.

Also das C# 32-Bit-JIT tut In-Line-Eigenschaften, das 64-Bit nicht, noch andere nicht-statische Methoden.