2014-10-14 22 views
20

czytałem przez źródeł .NET kiedy znalazłem to:.NET zmienna lokalna optymalizacja

// 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; 
} 

Jak widać, konstruktor przecinku kopii struktury metoda argument do zmiennej lokalnej zamiast używać bezpośrednio. Zastanawiałem się, co oznacza komentarz i jak odnosi się do optymalizacji wydajności?

Zgaduję, że jeśli chcesz zmodyfikować istniejący argument, metoda nie może być już inline?

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

Odpowiedz

15

Domyślam się, że raz chcesz zmodyfikować istniejącą argumentu, metoda może być dłużej inlined?

Krótka odpowiedź: Twoje przypuszczenie jest prawidłowe (jeśli komentarz kod źródłowy jest nadal prawdziwe dzisiaj).

// JIT today can't inline methods that contains "starg" opcode. 

"JIT" jest to, że część środowiska wykonawczego .NET przekłada intermediate language (IL) (i.e. .NET "bytecode") do asemblera komputera. Tylko wtedy kod może zostać wykonany przez twój komputer. JIT wykonuje tę metodę tłumaczenia według metody i tylko wtedy, gdy jest to rzeczywiście potrzebne: za każdym razem, gdy metoda jest wywoływana, najpierw jest ona kompilowana do rzeczywistego asemblera, "just-in-time" (JIT).

Kompilator języka C# nie generuje natychmiast języka asemblerowego dla architektury komputera; zamiast tego generuje on intermediate language, który jest rodzajem języka asemblerowego dla maszyny stosu abstrakcyjnego (która została zdefiniowana w ECMA 334 international standard).

Na przykład przypisania do parametru (w Twojej przykład: value) będzie tłumaczone przez kompilatora C# do instrukcji IL nazywa starg („sklep na argument”).

Komentarz zasadniczo mówi, że jeśli metoda zawiera takie przypisanie (value = …), wówczas JIT nie będzie w stanie "wstawić" go. oznacza, że ​​zamiast generowania instrukcji wywołania metody (tj. Poleceń rozgałęzienia do innej lokalizacji kodu), JIT wstawi zamiast tego całe ciało metody w miejscu, w którym zostanie wywołane. Zwykle robi się to, aby zoptymalizować prędkość wykonywania, ponieważ nie jest konieczne rozgałęzienie/skok, a dodatkowo zakładam, że nie trzeba również ustawiać nowej ramki stosu.

poprzez przypisanie zmiennej lokalnej zamiast (value_copy = …), to ograniczenie JIT obejść, ponieważ przyporządkowania do lokalne zmienne powodować różne instrukcje IL wygenerowanie: stloc („przechowywać na zmienne lokalne”).

Zobacz także:

+1

więc w zasadzie odpowiedź na to pytanie jest twierdząca. Zacząłem od tego i dodałem wyjaśnienie. – Clueless

+1

miła odpowiedź sir ... –

+0

@ Clueless: Dzięki za sugestię! Dodałem odpowiedź TL; DR. Mam tę irytującą tendencję do dawania długich odpowiedzi, których nie mogę pozbyć się. :) – stakx

Powiązane problemy