2009-07-27 4 views
8

Kann die .NET CLR-Laufzeitumgebung einfache Getter zur Laufzeit optimieren? Zum Beispiel:Führt die .NET CLR automatische Inlining von Eigenschaften?

property int Length { get; set; } 

Wird das die „Length__get“ -Funktion seine Ausführung (Aufbau einen Stapels für sie, Springen um den Code auszuführen, usw.), sobald es zur Laufzeit JIT'd ist? Oder ist der Jitter intelligent und weiß, dass dies nur als Klassenfeldzugriff umgeschrieben werden kann?

Antwort

13

Ja, die CLR wird das in "normalen" Fällen inline. Es gibt einige Situationen, in denen Inlining nicht stattfindet statt - einschließlich alles aus MarshalByRefObject abgeleitet (weil es ein Laufzeitproxy sein könnte).

Die Regeln für das, was inlined wird, hängt von der genauen CLR Sie verwenden - x64 vs x86, Version usw. Trivial Eigenschaften ungefähr so ​​wahrscheinlich sind inlined werden, wie Sie aber :)

bekommen (für Irgendein Grund, den ich eine triviale Eigenschaft gesehen habe, ist langsamer als ein Feldzugriff für verdoppeltes in der Vergangenheit ... dort kann einige Beschränkungen um Werte größer als die ursprüngliche Wortgröße sein.)

+0

@Jon, was meintest du mit "Werte größer als die ursprüngliche Wortgröße"? –

+3

Ich meine Dinge wie eine lange oder doppelte (jeder ist 64 Bit) auf einem 32-Bit-Prozessor. –

+0

Danke Jon. . –

7

In .Net 2.0 Methoden (einschließlich Property-Getter/Setter) wären inline, wenn sie weniger als 32 Bytes hätten.

Der .Net 3.5 JIT'r ist ein bisschen intelligenter, also kommt es darauf an. Es kann inline es sein.

Weitere Informationen hierzu finden Sie unter To Inline or not to Inline: That is the question.

+3

Gute Verbindung. Vance Morrison spricht ausführlich darüber, was in .NET 3.5 inline wird. –

+1

Interessanter Punkt über mehr Code (generiert über Inline), der langsamer ausgeführt wird, weil L1-Cache fehlschlägt. – Armentage

Verwandte Themen