TargetedPatchingOptOut: «Performances essentielles pour l'inline au-delà des frontières d'image NGen»?

140

J'ai parcouru certaines classes de cadre en utilisant Reflector et j'ai remarqué qu'un certain nombre de méthodes et de propriétés ont l'attribut suivant

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

Je suis à peu près sûr que j'ai également vu le commentaire ci-dessus ailleurs et je ne l'ai jamais suivi.

Quelqu'un pourrait-il me dire ce que cela signifie dans le C # et dans tout autre contexte?

Maxim Gershkovich
la source

Réponses:

176

Il indique à NGen qu'il est OK pour intégrer la méthode à laquelle il est appliqué, même dans un assemblage différent.

Par exemple:

  • String.Equals a [TargetedPatchingOptOut]
  • Vous écrivez un programme qui appelle String.Equals
  • Vous exécutez NGen sur ce programme pour des performances maximales
  • NGen intégrera l' String.Equalsappel, en remplaçant l'instruction d'appel de méthode par le code réel de la méthode.
    Les appels de méthode sont (légèrement) coûteux, il s'agit donc d'une amélioration des performances pour les méthodes fréquemment appelées.

Cependant, si Microsoft trouve une faille de sécurité String.Equals, ils ne peuvent pas simplement mettre à jour mscorlib.dll, car cela n'affectera pas l'assemblage que vous venez de NGen'd. (Puisqu'il a un code machine brut sans référencement String.Equals).
Je suppose que si cela se produisait réellement, la mise à jour de sécurité effacerait le magasin NGen.

Notez que cet attribut n'est utile que dans les assemblys .NET Framework. Vous n'en avez pas besoin. Vous pouvez trouver plus d'informations à ce sujet ici: https://stackoverflow.com/a/14982340/631802

SLaks
la source
18
Pouvons-nous utiliser cet attribut dans nos propres frameworks? Ma bibliothèque open source a beaucoup de fonctions mathématiques qui en bénéficieraient ...
MattDavey
3
Si le framework .NET est corrigé, les fichiers d'image natifs existants sont invalidés et recréés (du moins c'est ce que je comprends)
Motti
14
@MattDavey Non, vous ne devriez pas utiliser cet attribut dans votre propre code. Comme il est écrit dans le MSDN : «Cette API prend en charge l'infrastructure .NET Framework et n'est pas destinée à être utilisée directement à partir de votre code.». Cet attribut affecte uniquement les assemblys qui utilisent des correctifs ciblés. Une explication plus longue avec quelques liens sources peut être trouvée ici: stackoverflow.com/a/14982340/631802
cremor
25
Le fait que tout notre code puisse être automatiquement intégré à travers les limites de l'assemblage, ce qui signifie que cet attribut nous est complètement inutile, doit vraiment être mentionné dans la réponse ...
BlueRaja - Danny Pflughoeft
4
@MattDavey Si vous voulez donner au compilateur un coup de pouce pour que vos méthodes soient intégrées si possible, utilisez[MethodImpl(MethodImplOptions.AggressiveInlining)]
Basic