TargetedPatchingOptOut: „Wydajność krytyczna dla inline poza granicami obrazu NGen”?

140

Przeglądałem kilka klas frameworka przy użyciu reflektora i zauważyłem, że wiele metod i właściwości ma następujący atrybut

[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]

Jestem prawie pewien, że widziałem powyższy komentarz gdzie indziej i nigdy go nie śledziłem.

Czy ktoś mógłby mi powiedzieć, co to oznacza w C # i jakimkolwiek innym kontekście?

Maxim Gershkovich
źródło

Odpowiedzi:

176

Informuje NGen, że można wstawić metodę, do której została zastosowana, nawet w innym złożeniu.

Na przykład:

  • String.Equals ma [TargetedPatchingOptOut]
  • Piszesz program, który wywołuje String.Equals
  • W tym programie uruchamiasz NGen w celu uzyskania maksymalnej wydajności
  • NGen wbuduje String.Equalswywołanie, zastępując instrukcję wywołania metody rzeczywistym kodem metody.
    Wywołania metod są (nieco) drogie, więc jest to wzrost wydajności często wywoływanych metod.

Jeśli jednak Microsoft znajdzie lukę w zabezpieczeniach String.Equals, nie może po prostu zaktualizować mscorlib.dll, ponieważ nie wpłynie to na zestaw, który właśnie wydałeś. (Ponieważ ma surowy kod maszynowy bez odwołań String.Equals).
Zakładam, że gdyby tak się rzeczywiście stało, aktualizacja zabezpieczeń wyczyściłaby magazyn NGen.

Należy zauważyć, że ten atrybut jest przydatny tylko w zestawach .NET Framework. Nie potrzebujesz tego we własnym zakresie. Więcej informacji na ten temat znajdziesz tutaj: https://stackoverflow.com/a/14982340/631802

SLaks
źródło
18
Czy możemy użyć tego atrybutu w naszych własnych frameworkach? Moja biblioteka typu open source ma wiele funkcji matematycznych, które
przydałyby się na
3
Jeśli platforma .NET jest załatana, istniejące natywne pliki obrazów są unieważniane i odtwarzane (przynajmniej tak rozumiem)
Motti
14
@MattDavey Nie, nie powinieneś używać tego atrybutu we własnym kodzie. Jak napisano w witrynie MSDN : „Ten interfejs API obsługuje infrastrukturę .NET Framework i nie jest przeznaczony do użytku bezpośrednio z kodu użytkownika”. Ten atrybut ma wpływ tylko na zespoły, które używają ukierunkowanego poprawiania. Dłuższe wyjaśnienie z niektórymi linkami źródłowymi można znaleźć tutaj: stackoverflow.com/a/14982340/631802
cremor
25
Fakt, że cały nasz kod może być automatycznie wstawiany poza granice asemblera, co oznacza, że ​​ten atrybut jest dla nas całkowicie bezużyteczny, naprawdę musi zostać wspomniany w odpowiedzi ...
BlueRaja - Danny Pflughoeft
4
@MattDavey Jeśli chcesz dać kompilatorowi podpowiedź, że twoje metody powinny być wbudowane, jeśli to możliwe, użyj[MethodImpl(MethodImplOptions.AggressiveInlining)]
Basic