TargetetedPatchingOptOut:“ ประสิทธิภาพมีความสำคัญอย่างยิ่งต่อการอินไลน์ข้ามขอบเขตภาพ NGen”?


140

เคยผ่านบางคลาสเฟรมเวิร์กโดยใช้ตัวสะท้อนสัญญาณและสังเกตเห็นว่าเมธอดและคุณสมบัติจำนวนหนึ่งมีแอ็ตทริบิวต์ต่อไปนี้

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

ฉันค่อนข้างแน่ใจว่าฉันได้เห็นความคิดเห็นข้างต้นที่อื่นและไม่เคยติดตาม

มีคนช่วยบอกฉันหน่อยได้มั้ยว่าสิ่งนี้มีความหมายอย่างไรใน C # และบริบทอื่น ๆ

คำตอบ:


176

มันบอกเอ็นเกนว่ามันก็โอเคที่จะอินไลน์วิธีที่มันใช้กับแม้แต่ในแอสเซมบลีที่แตกต่างกัน

ตัวอย่างเช่น:

  • String.Equals มี [TargetedPatchingOptOut]
  • คุณเขียนโปรแกรมที่โทร String.Equals
  • คุณเรียกใช้NGenในโปรแกรมนี้เพื่อประสิทธิภาพสูงสุด
  • NGen จะString.Equalsโทรแบบอินไลน์โดยแทนที่คำสั่งการเรียกใช้เมธอดด้วยรหัสจริงในเมธอด
    การเรียกใช้เมธอดมีราคาแพง (เล็กน้อย) ดังนั้นนี่จึงเป็นการเพิ่มประสิทธิภาพสำหรับวิธีการที่เรียกบ่อย

อย่างไรก็ตามหาก Microsoft พบช่องโหว่ด้านความปลอดภัยString.Equalsพวกเขาจะไม่สามารถอัปเดตmscorlib.dllได้เนื่องจากจะไม่มีผลต่อแอสเซมบลีที่คุณเพิ่งใช้ NGen (เนื่องจากมีรหัสเครื่องดิบโดยไม่มีการอ้างอิงString.Equals)
ฉันคิดว่าถ้ามันจะเกิดขึ้นจริงการปรับปรุงความปลอดภัยจะล้างร้านค้า NGen

โปรดสังเกตว่าคุณลักษณะนี้มีประโยชน์เฉพาะในแอสเซมบลี. NET Framework คุณไม่ต้องการมันด้วยตัวคุณเอง คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับสิ่งนี้ได้ที่: https://stackoverflow.com/a/14982340/631802


18
เราสามารถใช้คุณลักษณะนี้ในกรอบงานของเราเองได้หรือไม่? ห้องสมุดแหล่งที่มาของฉันเปิดมีจำนวนมากของฟังก์ชั่นทางคณิตศาสตร์ซึ่งจะได้รับประโยชน์จากนี้ ...
MattDavey

3
หากกรอบ NET จะ patched ไฟล์ภาพพื้นเมืองที่มีอยู่จะถูกยกเลิกและบิ๊กแบง (อย่างน้อยที่เข้าใจของฉัน)
Motti

14
@MattDavey ไม่คุณไม่ควรใช้คุณสมบัตินี้ในรหัสของคุณเอง ตามที่เขียนไว้ในMSDN : "API นี้สนับสนุนโครงสร้างพื้นฐาน. NET Framework และไม่ได้มีวัตถุประสงค์เพื่อใช้โดยตรงจากรหัสของคุณ" คุณลักษณะนี้มีผลกับแอสเซมบลีที่ใช้การแพทช์เป้าหมายเท่านั้น คำอธิบายที่ยาวขึ้นพร้อมกับลิงค์แหล่งข้อมูลบางส่วนสามารถดูได้ที่นี่: stackoverflow.com/a/14982340/631802
cremor

25
ความจริงที่ว่ารหัสทั้งหมดของเราสามารถถูกแทรกข้ามขอบเขตการชุมนุมโดยอัตโนมัติซึ่งหมายความว่าคุณลักษณะนี้ไร้ประโยชน์อย่างสมบูรณ์สำหรับเราจำเป็นต้องพูดถึงจริงๆในคำตอบ ...
BlueRaja - Danny Pflughoeft

4
@MattDavey หากคุณต้องการให้คอมไพเลอร์เขยิบว่าวิธีการของคุณควรจะเป็นไปได้ถ้าเป็นไปได้ใช้[MethodImpl(MethodImplOptions.AggressiveInlining)]
พื้นฐาน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.