TargetedPatchingOptOut: "Prestazioni essenziali per inline oltre i confini delle immagini NGen"?


140

Ho attraversato alcune classi di framework usando reflector e ho notato che alcuni metodi e proprietà hanno il seguente attributo

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

Sono abbastanza sicuro di aver visto il commento sopra da qualche altra parte e non l'ho mai seguito.

Qualcuno potrebbe dirmi cosa significa questo nel C # e in qualsiasi altro contesto?

Risposte:


176

Indica a NGen che è OK incorporare il metodo a cui è applicato anche in un assembly diverso.

Per esempio:

  • String.Equals ha [TargetedPatchingOptOut]
  • Scrivi un programma che chiama String.Equals
  • Si esegue NGen su questo programma per le massime prestazioni
  • NGen inserirà la String.Equalschiamata, sostituendo l'istruzione di chiamata del metodo con il codice effettivo nel metodo.
    Le chiamate ai metodi sono (leggermente) costose, quindi si tratta di un aumento delle prestazioni per i metodi chiamati di frequente.

Tuttavia, se Microsoft trova una falla nella sicurezza String.Equals, non possono semplicemente aggiornarsi mscorlib.dll, perché ciò non influirà sull'assemblaggio che hai appena NGen'd. (Dal momento che ha un codice macchina grezzo senza riferimento String.Equals).
Suppongo che se ciò dovesse effettivamente accadere, l'aggiornamento per la protezione eliminerebbe l'archivio NGen.

Si noti che questo attributo è utile solo negli assembly .NET Framework. Non ne hai bisogno nel tuo. Puoi trovare maggiori informazioni al riguardo qui: https://stackoverflow.com/a/14982340/631802


18
Possiamo usare questo attributo nei nostri framework? La mia libreria open source ha molte funzioni matematiche che trarrebbero beneficio da questo ...
MattDavey,

3
Se il framework .NET viene patchato, i file di immagini native esistenti vengono invalidati e ricreati (almeno questo è quello che intendo)
Motti

14
@MattDavey No, non dovresti usare questo attributo nel tuo codice. Come è scritto in MSDN : "Questa API supporta l'infrastruttura .NET Framework e non è pensata per essere utilizzata direttamente dal tuo codice". Questo attributo influisce solo sugli assembly che utilizzano patch mirate. Una spiegazione più lunga con alcuni link sorgente è disponibile qui: stackoverflow.com/a/14982340/631802
cremor

25
Il fatto che tutto il nostro codice può automaticamente essere inline attraverso limiti di assemblaggio, il che significa questo attributo è del tutto inutile per noi, in realtà ha bisogno di essere menzionato nella risposta ...
BlueRaja - Danny Pflughoeft

4
@MattDavey Se vuoi dare una spinta al compilatore che i tuoi metodi dovrebbero essere incorporati se possibile, usa[MethodImpl(MethodImplOptions.AggressiveInlining)]
Basic
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.