TargetedPatchingOptOut: „Leistung, die für die Inline-Inline über NGen-Bildgrenzen hinweg entscheidend ist“?


140

Ich habe einige Framework-Klassen mit Reflektor durchlaufen und festgestellt, dass einige der Methoden und Eigenschaften das folgende Attribut aufweisen

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

Ich bin mir ziemlich sicher, dass ich den obigen Kommentar auch woanders gesehen und ihn nie weiterverfolgt habe.

Könnte mir bitte jemand sagen, was dies im C # und in einem anderen Kontext bedeutet?

Antworten:


176

Es teilt NGen mit, dass es in Ordnung ist, die Methode, auf die es angewendet wird, auch in einer anderen Assembly einzubinden.

Beispielsweise:

  • String.Equals hat [TargetedPatchingOptOut]
  • Sie schreiben ein Programm, das aufruft String.Equals
  • Sie führen NGen in diesem Programm aus, um maximale Leistung zu erzielen
  • NGen wird den String.EqualsAufruf einbinden und die Anweisung zum Methodenaufruf durch den tatsächlichen Code in der Methode ersetzen.
    Methodenaufrufe sind (geringfügig) teuer, daher ist dies eine Leistungssteigerung für häufig aufgerufene Methoden.

Wenn Microsoft jedoch eine Sicherheitslücke findet String.Equals, können diese nicht einfach aktualisiert werden mscorlib.dll, da dies keine Auswirkungen auf die Assembly hat, die Sie gerade nicht installiert haben. (Da es rohen Maschinencode ohne Referenzierung hat String.Equals).
Ich gehe davon aus, dass das Sicherheitsupdate den NGen-Store löschen würde, wenn dies tatsächlich passieren würde.

Beachten Sie, dass dieses Attribut nur in .NET Framework-Assemblys nützlich ist. Du brauchst es nicht alleine. Weitere Informationen hierzu finden Sie hier: https://stackoverflow.com/a/14982340/631802


18
Können wir dieses Attribut in unseren eigenen Frameworks verwenden? Meine Open-Source-Bibliothek hat viele mathematische Funktionen, die davon profitieren würden ...
MattDavey

3
Wenn das .NET Framework gepatcht ist, werden die vorhandenen nativen Bilddateien ungültig gemacht und neu erstellt (zumindest verstehe ich das)
Motti

14
@MattDavey Nein, Sie sollten dieses Attribut nicht in Ihrem eigenen Code verwenden. Wie im MSDN geschrieben : "Diese API unterstützt die .NET Framework-Infrastruktur und ist nicht für die direkte Verwendung in Code vorgesehen." Dieses Attribut betrifft nur Assemblys, die gezieltes Patchen verwenden. Eine längere Erklärung mit einigen Quelllinks
cremor

25
Die Tatsache, dass unser gesamter Code automatisch über Baugruppengrenzen hinweg eingefügt werden kann, was bedeutet, dass dieses Attribut für uns völlig nutzlos ist, muss in der Antwort wirklich erwähnt werden ...
BlueRaja - Danny Pflughoeft

4
@ MattDavey Wenn Sie dem Compiler einen Anstoß geben möchten, dass Ihre Methoden nach Möglichkeit inline sein sollten, verwenden Sie[MethodImpl(MethodImplOptions.AggressiveInlining)]
Basic
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.