2014-10-14 18 views
20

ich durch die .NET-Quellen las, als ich das gefunden:.NET lokale Variable Optimierung

// Constructs a Decimal from an integer value. 
// 
public Decimal(int value) { 
    // JIT today can't inline methods that contains "starg" opcode. 
    // For more details, see DevDiv Bugs 81184: x86 JIT CQ: 
    // Removing the inline striction of "starg". 
    int value_copy = value; 
    if (value_copy >= 0) { 
     flags = 0; 
    } 
    else { 
     flags = SignMask; 
     value_copy = -value_copy; 
    } 
    lo = value_copy; 
    mid = 0; 
    hi = 0; 
} 

Wie Sie sehen können, der Konstruktor der Dezimal-Struktur kopiert die Methode Argument auf eine lokale Variable anstatt es direkt. Ich habe mich gefragt, was der Kommentar bedeutet und wie es sich auf die Leistung bezieht & Optimierung?

Meine Vermutung ist, dass wenn Sie das vorhandene Argument ändern möchten, kann Methode nicht mehr inline sein?

http://referencesource.microsoft.com/#mscorlib/system/decimal.cs#f9a4da9d6e110054#references

Antwort

15

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:

+1

so dass im Grunde die Antwort auf seine Frage ja ist. Ich hätte damit angefangen und die Erklärung hinzugefügt. – Clueless

+1

nette antwort sir ... –

+0

@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