TargetedPatchingOptOut: «Производительность критична для встраивания через границы изображений 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, потому что это не повлияет на сборку, которую вы только что создали. (Поскольку он имеет необработанный машинный код без ссылок String.Equals).
Я предполагаю, что если это действительно произойдет, обновление безопасности очистит хранилище NGen.

Обратите внимание, что этот атрибут полезен только в сборках .NET Framework. Сама по себе она не нужна. Вы можете найти дополнительную информацию об этом здесь: https://stackoverflow.com/a/14982340/631802

SLaks
источник
18
Можем ли мы использовать этот атрибут в наших собственных фреймворках? В моей библиотеке с открытым исходным кодом есть много математических функций, которым это поможет ...
MattDavey,
3
Если платформа .NET исправлена, существующие файлы изображений в машинном коде будут признаны недействительными и воссозданы заново (по крайней мере, я так понимаю)
Мотти
14
@MattDavey Нет, вам не следует использовать этот атрибут в собственном коде. Как написано в MSDN : «Этот API поддерживает инфраструктуру .NET Framework и не предназначен для использования непосредственно из вашего кода». Этот атрибут влияет только на сборки, в которых используется целевое исправление. Более
подробное
25
Тот факт, что весь наш код может автоматически быть встроен в границы сборки, что означает, что этот атрибут для нас совершенно бесполезен, действительно необходимо упомянуть в ответе ...
BlueRaja - Дэнни Пфлугхофт
5
@MattDavey Если вы хотите подтолкнуть компилятор к тому, что ваши методы должны быть встроены, если это возможно, используйте[MethodImpl(MethodImplOptions.AggressiveInlining)]
Basic