TargetedPatchingOptOut: “Desempenho crítico para alinhar através dos limites da imagem NGen”?

140

Passando por algumas classes de estrutura usando refletor e percebi que vários métodos e propriedades têm o seguinte atributo

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

Tenho certeza de que também vi o comentário acima em outro lugar e nunca o segui.

Alguém poderia me dizer o que isso significa no C # e em qualquer outro contexto?

Maxim Gershkovich
fonte

Respostas:

176

Ele diz à NGen que não há problema em alinhar o método ao qual é aplicado, mesmo em uma montagem diferente.

Por exemplo:

  • String.Equals tem [TargetedPatchingOptOut]
  • Você escreve um programa que chama String.Equals
  • Você executa o NGen neste programa para obter o desempenho máximo
  • O NGen alinhará a String.Equalschamada, substituindo a instrução de chamada do método pelo código real no método.
    As chamadas de método são (um pouco) caras, portanto, isso é um aumento de desempenho para os métodos chamados com freqüência.

No entanto, se a Microsoft encontrar uma falha de segurança String.Equals, eles não poderão apenas atualizar mscorlib.dll, porque isso não afetará o assembly que você acabou de NGen. (Como possui código de máquina bruto sem referência String.Equals).
Presumo que, se isso realmente acontecesse, a atualização de segurança limparia o armazenamento NGen.

Observe que esse atributo é útil apenas nos assemblies do .NET Framework. Você não precisa disso sozinho. Você pode encontrar mais informações sobre isso aqui: https://stackoverflow.com/a/14982340/631802

SLaks
fonte
18
Podemos usar esse atributo em nossas próprias estruturas? Minha biblioteca de código aberto tem um monte de funções matemáticas que se beneficiaria deste ...
MattDavey
3
Se o .NET framework é remendado os arquivos de imagem nativas existentes são invalidados e recriado (pelo menos é o meu entendimento)
Motti
14
@MattDavey Não, você não deve usar esse atributo em seu próprio código. Conforme está escrito no MSDN : "Esta API suporta a infraestrutura do .NET Framework e não se destina a ser usada diretamente em seu código.". Esse atributo afeta apenas os assemblies que usam patch direcionado. Uma explicação mais longa com alguns links de origem pode ser encontrada aqui: stackoverflow.com/a/14982340/631802
cremor
25
O fato de que todo o nosso código pode automaticamente ser embutido em toda limites de montagem, o que significa que este atributo é completamente inútil para nós, realmente precisa ser mencionado na resposta ...
BlueRaja - Danny Pflughoeft
4
@MattDavey Se você quiser dar o compilador uma cotovelada que seus métodos devem ser embutido Se possível, use[MethodImpl(MethodImplOptions.AggressiveInlining)]
Básico