TargetedPatchingOptOut: ¿"Rendimiento crítico para alinear a través de los límites de la imagen NGen"?

140

He estado revisando algunas clases de framework usando reflector y noté que varios métodos y propiedades tienen el siguiente atributo

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

Estoy bastante seguro de que también he visto el comentario anterior en otro lugar y nunca lo seguí.

¿Podría alguien decirme qué significa esto en C # y en cualquier otro contexto?

Maxim Gershkovich
fuente

Respuestas:

176

Le dice a NGen que está bien alinear el método al que se aplica incluso en un ensamblaje diferente.

Por ejemplo:

  • String.Equals tiene [TargetedPatchingOptOut]
  • Escribes un programa que llama String.Equals
  • Ejecutar NGen en este programa para un máximo rendimiento
  • NGen alineará la String.Equalsllamada, reemplazando la instrucción de llamada al método con el código real en el método.
    Las llamadas a métodos son (ligeramente) costosas, por lo que este es un aumento de rendimiento para los métodos llamados con frecuencia.

Sin embargo, si Microsoft encuentra un agujero de seguridad String.Equals, no puede simplemente actualizar mscorlib.dll, porque eso no afectará el ensamblaje que acaba de NGen'd. (Ya que tiene código máquina sin procesar sin referencia String.Equals).
Supongo que si eso sucediera realmente, la actualización de seguridad eliminaría la tienda NGen.

Tenga en cuenta que este atributo solo es útil en los ensamblados de .NET Framework. No lo necesitas en la tuya. Puede encontrar más información al respecto aquí: https://stackoverflow.com/a/14982340/631802

SLaks
fuente
18
¿Podemos usar este atributo en nuestros propios marcos? Mi biblioteca de código abierto tiene muchas funciones matemáticas que se beneficiarían de esto ...
MattDavey
3
Si se repara el marco .NET, los archivos de imagen nativos existentes se invalidan y se recrean (al menos eso entiendo)
Motti
14
@MattDavey No, no debe usar este atributo en su propio código. Como está escrito en el MSDN : "Esta API es compatible con la infraestructura de .NET Framework y no está diseñada para usarse directamente desde su código". Este atributo solo afecta a los ensamblados que usan parches dirigidos. Puede encontrar una explicación más larga con algunos enlaces de origen aquí: stackoverflow.com/a/14982340/631802
cremor
25
El hecho de que todos los de nuestro código de forma automática puede ser inline a través de los límites de montaje, es decir, este atributo es completamente inútil para nosotros, realmente necesita ser mencionado en la respuesta ...
BlueRaja - Danny Pflughoeft
44
@MattDavey Si desea darle al compilador un empujón de que sus métodos deberían estar integrados si es posible, use[MethodImpl(MethodImplOptions.AggressiveInlining)]
Básico