Tar targetPatchingOptOut: "Ефективність критична для вбудовування через межі зображення NGen"?


140

Проходив деякі рамкові класи за допомогою рефлектора та помітив, що ряд методів та властивостей має такий атрибут

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

Я впевнений, що я також бачив вищезазначений коментар десь ще і ніколи не дотримувався цього.

Невже хтось скаже, будь ласка, що це означає у C # та будь-якому іншому контексті?

Відповіді:


176

Це говорить NGen, що добре вбудувати метод, до якого він застосовується, навіть в іншому складі.

Наприклад:

  • String.Equals має [TargetedPatchingOptOut]
  • Ви пишете програму, яка дзвонить String.Equals
  • Ви запускаєте NGen у цій програмі для досягнення максимальної продуктивності
  • NGen буде вбудовувати String.Equalsвиклик, замінюючи інструкцію виклику методу фактичним кодом методу.
    Виклики методів (злегка) дорогі, тому це збільшення продуктивності для часто називаних методів.

Однак якщо Microsoft знайде дірку в безпеці String.Equals, вони не можуть просто оновитись mscorlib.dll, оскільки це не вплине на збірку, яку ви просто зробили NGen'd. (Оскільки він має сирий код машини без посилання String.Equals).
Я припускаю, що якби насправді це сталося, оновлення безпеки очистило б магазин NGen.

Зауважте, що цей атрибут корисний лише у складі .NET Framework. Вам це не потрібно в своєму власному. Ви можете знайти більше інформації про це тут: https://stackoverflow.com/a/14982340/631802


18
Чи можемо ми використовувати цей атрибут у власних рамках? Моя бібліотека з відкритим кодом має безліч математичних функцій, які могли б отримати користь від цього ...
MattDavey,

3
Якщо рамка .NET буде виправлена, то наявні файли власних зображень недійсні та відтворені (принаймні, так я розумію)
Motti

14
@MattDavey Ні, ви не повинні використовувати цей атрибут у власному коді. Як написано в MSDN : "Цей API підтримує інфраструктуру .NET Framework і не призначений для використання безпосередньо з вашого коду." Цей атрибут впливає лише на збірки, які використовують цільове виправлення. Довший пояснення з деякими джерелами посилань можна знайти тут: stackoverflow.com/a/14982340/631802
cremor

25
Про те, що весь наш код може бути автоматично накреслений через межі складання, тобто цей атрибут нам абсолютно марний, насправді потрібно згадати у відповіді ...
BlueRaja - Danny Pflughoeft

4
@MattDavey Якщо ви хочете дати компілятору підкреслити, що ваші методи слід позначати, якщо це можливо, використовуйте[MethodImpl(MethodImplOptions.AggressiveInlining)]
Basic
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.