TargetedPatchingOptOut: "Kinerja penting untuk sebaris melintasi batas gambar NGen"?

140

Telah melalui beberapa kelas kerangka kerja menggunakan reflektor dan memperhatikan sejumlah metode dan properti memiliki atribut berikut

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

Saya cukup yakin saya juga melihat komentar di atas di tempat lain dan tidak pernah menindaklanjutinya.

Bisakah seseorang tolong beri tahu saya apa artinya ini dalam C # dan konteks lainnya?

Maxim Gershkovich
sumber

Jawaban:

176

Ia memberi tahu NGen bahwa tidak apa-apa untuk menyelaraskan metode itu diterapkan bahkan dalam majelis yang berbeda.

Sebagai contoh:

  • String.Equals telah [TargetedPatchingOptOut]
  • Anda menulis sebuah program yang memanggil String.Equals
  • Anda menjalankan NGen pada program ini untuk kinerja maksimum
  • NGen akan inline String.Equalspanggilan, mengganti instruksi panggilan metode dengan kode aktual dalam metode.
    Metode panggilan (sedikit) mahal, jadi ini merupakan peningkatan kinerja untuk metode yang sering disebut.

Namun, jika Microsoft menemukan celah keamanan String.Equals, mereka tidak bisa hanya memperbarui mscorlib.dll, karena itu tidak akan mempengaruhi perakitan yang baru saja Anda lakukan. (Karena memiliki kode mesin mentah tanpa referensi String.Equals).
Saya berasumsi bahwa jika itu benar-benar terjadi, pembaruan keamanan akan menghapus toko NGen.

Perhatikan bahwa atribut ini hanya berguna di majelis .NET Framework. Anda tidak membutuhkannya sendiri. Anda dapat menemukan informasi lebih lanjut tentang itu di sini: https://stackoverflow.com/a/14982340/631802

Slaks
sumber
18
Bisakah kita menggunakan atribut ini dalam kerangka kerja kita sendiri? Pustaka sumber terbuka saya memiliki banyak fungsi matematika yang akan mendapat manfaat dari ini ...
MattDavey
3
Jika kerangka NET. Ditambal file gambar asli yang ada tidak valid dan diciptakan kembali (setidaknya itu pemahaman saya)
Motti
14
@MattDavey Tidak, Anda tidak boleh menggunakan atribut ini dalam kode Anda sendiri. Seperti yang tertulis dalam MSDN : "API ini mendukung infrastruktur .NET Framework dan tidak dimaksudkan untuk digunakan langsung dari kode Anda.". Atribut ini hanya memengaruhi majelis yang menggunakan tambalan yang ditargetkan. Penjelasan yang lebih panjang dengan beberapa tautan sumber dapat ditemukan di sini: stackoverflow.com/a/14982340/631802
cremor
25
Fakta bahwa semua kode kita dapat secara otomatis diuraikan di seluruh batas perakitan, yang berarti atribut ini sama sekali tidak berguna bagi kita, benar-benar perlu disebutkan dalam jawabannya ...
BlueRaja - Danny Pflughoeft
4
@MattDavey Jika Anda ingin memberikan kompiler dorongan bahwa metode Anda harus diuraikan jika memungkinkan, gunakan[MethodImpl(MethodImplOptions.AggressiveInlining)]
Basic