TargetedPatchingOptOut: Hiệu suất quan trọng đối với nội tuyến trên ranh giới hình ảnh NGen?


140

Đã trải qua một số lớp khung bằng phản xạ và nhận thấy một số phương thức và thuộc tính có thuộc tính sau

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

Tôi khá chắc chắn rằng tôi cũng đã thấy nhận xét trên ở một nơi khác và không bao giờ theo dõi nó.

Ai đó có thể vui lòng cho tôi biết điều này có nghĩa là gì trong C # và bất kỳ bối cảnh nào khác không?

Câu trả lời:


176

Nó nói với NGen rằng việc chấp nhận phương thức mà nó được áp dụng ngay cả trong một tổ hợp khác là ổn.

Ví dụ:

  • String.Equals[TargetedPatchingOptOut]
  • Bạn viết một chương trình gọi String.Equals
  • Bạn chạy NGen trên chương trình này để có hiệu suất tối đa
  • NGen sẽ nội tuyến String.Equalscuộc gọi, thay thế hướng dẫn cuộc gọi phương thức bằng mã thực tế trong phương thức.
    Các cuộc gọi phương thức (hơi) đắt tiền, vì vậy đây là một sự tăng hiệu năng cho các phương thức thường được gọi.

Tuy nhiên, nếu Microsoft tìm thấy lỗ hổng bảo mật String.Equals, họ không thể cập nhật mscorlib.dll, vì điều đó sẽ không ảnh hưởng đến hội đồng mà bạn vừa NGen. (Vì nó có mã máy thô mà không cần tham khảo String.Equals).
Tôi cho rằng nếu điều đó thực sự xảy ra, bản cập nhật bảo mật sẽ xóa cửa hàng NGen.

Lưu ý rằng thuộc tính này chỉ hữu ích trong các cụm .NET Framework. Bạn không cần nó trong của riêng bạn. Bạn có thể tìm thêm thông tin về điều đó tại đây: https://stackoverflow.com/a/14982340/631802


18
Chúng ta có thể sử dụng thuộc tính này trong khuôn khổ của chúng ta? Thư viện mã nguồn mở của tôi có rất nhiều hàm toán học sẽ được hưởng lợi từ điều này ...
MattDavey

3
Nếu .NET framework được vá, các tệp hình ảnh gốc hiện tại sẽ bị vô hiệu và được tạo lại (ít nhất đó là sự hiểu biết của tôi)
Motti

14
@MattDavey Không, bạn không nên sử dụng thuộc tính này trong mã của riêng bạn. Như được viết trong MSDN : "API này hỗ trợ cơ sở hạ tầng .NET Framework và không có ý định sử dụng trực tiếp từ mã của bạn.". Thuộc tính này chỉ ảnh hưởng đến các hội đồng sử dụng vá mục tiêu. Một lời giải thích dài hơn với một số liên kết nguồn có thể được tìm thấy ở đây: stackoverflow.com/a/14982340/631802
hỏa táng

25
Thực tế là tất cả các mã của chúng tôi có thể tự động được đặt trong các giới hạn lắp ráp, có nghĩa là thuộc tính này hoàn toàn vô dụng đối với chúng tôi, thực sự cần được đề cập trong câu trả lời ...
BlueRaja - Danny Pflughoeft

4
@MattDavey Nếu bạn muốn cung cấp cho trình biên dịch một cú huých rằng các phương thức của bạn sẽ được nội tuyến nếu có thể, hãy sử dụng[MethodImpl(MethodImplOptions.AggressiveInlining)]
Basic
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.