2015-02-11 18 views
7

Trình biên dịch C# có tối ưu hóa các phương thức trống rỗng không? Something nhưTrình biên dịch có hủy các phương thức trống không?

private void DoNothing() 
{ 
} 

Như về cơ bản, không có mã đang chạy ngoài thêm DoNothing để các cuộc gọi stack và loại bỏ nó một lần nữa, nó sẽ không thể tốt hơn để tối ưu hóa cuộc gọi này đi?

Trả lời

18

Trình biên dịch C# có tối ưu hóa các phương thức trống rỗng không?

Không. Chúng vẫn có thể được truy cập thông qua phản ánh, vì vậy điều quan trọng là bản thân phương pháp vẫn tồn tại.

Bất kỳ trang web cuộc gọi nào cũng có thể bao gồm cả cuộc gọi - nhưng JIT có thể tối ưu hóa chúng. Đó là một vị trí tốt hơn để làm như vậy. Về cơ bản nó là trường hợp đặc biệt của nội tuyến, trong đó mã nội tuyến trống.

Lưu ý rằng nếu bạn gọi nó trên một đối tượng khác:

foo.DoNothing(); 

đó là không một không-op, bởi vì nó sẽ kiểm tra xem foo là phi null.

+0

Ah, tôi không nghĩ đến việc null gọi một phương thức và do đó thất bại –

3

Không bao giờ. Trình biên dịch không liên quan đến những gì trống hoặc không được viết. Nó chỉ là những gì bạn viết, bạn nhận được trong MSIL của bạn. bạn có thể kiểm tra xem nó ở đây trong ILDASM

enter image description here

3

Nếu bạn muốn, bạn có thể đánh chặn các sự kiện sau xây dựng cho mỗi dự án và chạy một công cụ kiểm tra IL sẽ phản ánh dll tạo của bạn, kiểm tra mỗi MethodInfo trong loại của bạn và yêu cầu IL tìm kiếm các mẫu IL rỗng như chỉ các hướng dẫn NoOp IL và loại bỏ các phương thức không mong muốn.

Ví dụ: var ilBytes = SomeMethodInfo.GetMethodBody(). GetILAsByteArray();

Công cụ tối ưu hóa tốt sẽ "tỉa" các phương pháp theo cách này. preemptive.com/products/dotfuscator/features#pruning - weston 5 mins ago

Bạn có thể sử dụng công cụ bên ngoài của visual studio để tìm phương pháp có sản phẩm nào và loại bỏ chúng khỏi tập tin chúng được định nghĩa hoặc sử dụng trong

.
+1

Một công cụ obfuscation tốt sẽ "tỉa" các phương thức theo cách này. http://www.preemptive.com/products/dotfuscator/features#pruning – weston

+0

Bạn đã nói một điểm tốt, cảm ơn nhận xét :) –

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