2011-03-21 88 views

Trả lời

5

Chúng không bao giờ được trình biên dịch C# bao hàm. Chỉ có các trường const.

Bạn có thể xem xét tối ưu hóa trình biên dịch C# here.

Bạn thể chắc chắn rằng một phương pháp hay tài sản accessor là bao giờ inlined với thuộc tính này áp dụng cho nó:

[MethodImpl(MethodImplOptions.NoInlining)] 
7

Không - vì nó không xảy ra ở thời gian xây dựng; nó xảy ra vào thời điểm JIT. Trình biên dịch C# sẽ không thực hiện bất kỳ nội tuyến nào; nó lên đến CLR rằng mã kết thúc lên chạy.

Bạn có thể khám phá điều này bằng cách sử dụng dây cáp với tất cả các tối ưu hóa JIT được bật, nhưng bạn sẽ cần phải tìm hiểu mã lắp ráp. Tôi không biết cách nào phát hiện ra điều này trong mã. (Có thể bạn có thể làm như vậy với API trình gỡ lỗi, mặc dù điều đó cũng có thể vô hiệu hóa một số nội tuyến để bắt đầu.)

3

Bạn sẽ phải xem mã máy. Đặt một điểm ngắt trên cuộc gọi phương thức và khi nó chạm, nhấp chuột phải và chọn Chuyển đến hội đồng. Nếu bạn không nhìn thấy câu lệnh CALL thì nó đã được inlined. Bạn sẽ phải tăng tốc một chút về việc đọc mã máy để thực sự chắc chắn, bạn có thể thấy một cuộc gọi trong phương thức nội tuyến.

Để thực hiện điều này chính xác, bạn sẽ phải sử dụng Công cụ + Tùy chọn, Gỡ lỗi, Chung, bỏ chọn "Suppress JIT optimization on load module". Mà đảm bảo jitter cư xử như nó không có trình gỡ lỗi, phương pháp sẽ không được inlined khi tối ưu hóa được tắt.

1

Thêm mã trong nội dung phương pháp để kiểm tra dấu vết ngăn xếp bằng cách sử dụng StackFrame. Theo kinh nghiệm của tôi, các phương thức nội tuyến được loại trừ khỏi dấu vết ngăn xếp này.

Các vấn đề liên quan