Meine Vermutung, dass ist, wenn Sie zu ändern Sie die vorhandene Argument wollen
können Verfahren länger werden keine inlined?
Kurze Antwort: Ihre Vermutung richtig ist (wenn der Quellcode Kommentar gilt auch heute noch).
// JIT today can't inline methods that contains "starg" opcode.
"Der JIT" ist, dass ein Teil der .NET-Laufzeit, die intermediate language (IL) (i.e. .NET "bytecode") Ihres Computers Assemblersprache übersetzt. Nur dann kann Code von Ihrem Computer ausgeführt werden. Der JIT führt diese Übersetzung methodisch und nur dann aus, wenn sie tatsächlich benötigt wird: Immer wenn eine Methode zuerst aufgerufen wird, wird sie zuerst in die tatsächliche Assemblersprache "just-in-time" (JIT) kompiliert.
Der C# -Compiler erzeugt keine Assemblersprache für die Architektur Ihres Computers; stattdessen erzeugt es intermediate language, was eine Art Assemblersprache für eine abstrakte Stapelmaschine ist (die in ECMA 334 international standard definiert wurde).
Zum Beispiel Zuweisungen auf einen Parameter (in Ihrem Beispiel: value
) würden durch den C# -Compiler zu einem IL-Befehl genannt („Shop Argument“) starg
übersetzen lassen.
Der Kommentar sagt im Grunde, dass, wenn die Methode eine solche Zuweisung enthielt (value = …
), die JIT dann nicht in der Lage wäre, sie "inline" zu setzen. "Inlining a method" bedeutet, dass anstelle des Generierens von Aufrufanweisungen für eine Methode (d. H. Verzweigen von Befehlen an eine andere Codestelle) der JIT stattdessen den gesamten Körper der Methode an der Stelle einfügen würde, an der er aufgerufen wird. Dies wird normalerweise durchgeführt, um die Ausführungsgeschwindigkeit zu optimieren, da kein Sprung/Sprung notwendig ist, und außerdem nehme ich an, dass auch kein neuer Stapelrahmen eingerichtet werden muss.
Durch die Zuweisung an eine lokale Variable (value_copy = …
) wird diese Begrenzung des JIT umgangen, da bei Zuweisungen zu lokalen Variablen ein anderer IL-Befehl generiert wird: stloc
("auf lokale Variable speichern").
Siehe auch:
so dass im Grunde die Antwort auf seine Frage ja ist. Ich hätte damit angefangen und die Erklärung hinzugefügt. – Clueless
nette antwort sir ... –
@Clueless: Danke für Ihren Vorschlag! Ich habe eine TL-/DR-Antwort hinzugefügt. Ich habe diese nervige Tendenz, langatmige Antworten zu geben, die ich nicht loswerden kann. :) – stakx