Kann die .NET CLR-Laufzeitumgebung die einfachen Eigenschaften-Getter zur Laufzeit optimieren? Zum Beispiel:
%Vor%Wird dies die "Length__get" -Funktion ausführen (einen Stack dafür erstellen, springen, um den Code auszuführen usw.), wenn es zur Laufzeit JIT'd ist? Oder ist der Jitter intelligent und weiß, dass dies einfach als Klassenfeldzugriff umgeschrieben werden kann?
Ja, die CLR wird das in "normalen" Fällen inline machen. Es gibt jedoch einige Situationen, in denen das Inlining nicht stattfindet - einschließlich allem, was von MarshalByRefObject
abgeleitet wurde (weil es ein Laufzeit-Proxy sein könnte).
Die Regeln dafür, was inline wird, hängen von der genauen CLR ab, die du verwendest - x64 vs x86, Version usw. Triviale Eigenschaften sind ungefähr so gut inline wie du es bekommst:)
(Aus irgendeinem Grund habe ich gesehen, dass eine triviale Eigenschaft langsamer als ein Feldzugriff für Doubles in der Vergangenheit ist ... bei Werten, die größer als die native Wortgröße sind, können einige Einschränkungen bestehen.)
In .Net 2.0 wären Methoden (einschließlich Eigenschaften-Getter / Setter) 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 genau es inline.
Eine Diskussion hierzu finden Sie unter Inline oder nicht inline: Das ist die Frage .