2008-08-14 33 views
20

Với một thân phương thức rỗng, JIT sẽ tối ưu hóa cuộc gọi (tôi biết trình biên dịch C# sẽ không). Làm thế nào tôi sẽ đi về tìm hiểu? Tôi nên sử dụng công cụ gì và tôi nên tìm ở đâu?Trong .NET, các cuộc gọi phương thức trống sẽ được tối ưu hóa?

Vì tôi chắc chắn nó sẽ được hỏi, lý do cho phương thức trống là một chỉ thị tiền xử lý.


@Chris: Làm cho tinh thần, nhưng nó có thể tối ưu hóa các cuộc gọi đến phương thức. Vì vậy, phương pháp sẽ vẫn tồn tại, nhưng các cuộc gọi tĩnh đến nó có thể bị xóa (hoặc ít nhất là nội tuyến ...)

@Jon: Điều đó chỉ cho tôi trình biên dịch ngôn ngữ không làm bất cứ điều gì. Tôi nghĩ rằng những gì tôi cần làm là chạy dll của tôi thông qua ngen và nhìn vào hội đồng.

Trả lời

1

Không, các phương pháp trống không bao giờ được tối ưu hóa. Dưới đây là một vài lý do tại sao:

  • Phương pháp này có thể được gọi từ một lớp có nguồn gốc, có lẽ trong một hội đồng khác nhau
  • Phương pháp có thể được gọi là sử dụng Reflection (ngay cả khi nó được đánh dấu riêng)

Chỉnh sửa: Có, khi nhìn vào dự án mã (exellent) đó, JITer sẽ loại bỏ các cuộc gọi đến các phương thức trống. Nhưng các phương pháp tự vẫn sẽ được biên soạn và một phần của nhị phân của bạn vì những lý do tôi liệt kê.

1

Mọi thứ đều bằng nhau, có nó cần được tối ưu hóa. Hàm JIT nhấn mạnh các hàm thích hợp và có ít điều thích hợp hơn các hàm trống :)

Nếu bạn thực sự muốn chắc chắn thì hãy thay đổi phương thức trống để ném ngoại lệ và in ra dấu vết ngăn chứa nó.

12

chap này có điều trị khá tốt của optimisations JIT, thực hiện tìm kiếm trên trang cho 'phương pháp là trống', đó là khoảng một nửa đường xuống bài viết -

http://www.codeproject.com/KB/dotnet/JITOptimizations.aspx

phương pháp Rõ ràng rỗng làm được được tối ưu hóa thông qua nội tuyến những gì không có mã hiệu quả.

@Chris: Tôi nhận ra rằng các phương pháp vẫn sẽ là một phần của tệp nhị phân và đây là các tối ưu hóa JIT :-). Trên một lưu ý bán liên quan, Scott Hanselman đã có khá một bài viết thú vị về nội tuyến trong phiên bản ngăn xếp build gọi:

http://www.hanselman.com/blog/ReleaseISNOTDebug64bitOptimizationsAndCMethodInliningInReleaseBuildCallStacks.aspx

0

@ Jon Limjap: Chúng tôi đã biết biên dịch C# không tối ưu hóa phương pháp rỗng ra. Kể từ khi những gì bạn đang biên dịch ngược với ildasm được tạo ra bởi trình biên dịch C# ... không có sự giúp đỡ ở đó.

10

Tôi đoán mã của bạn cũng giống như:

void DoSomethingIfCompFlag() { 
#if COMPILER_FLAG 
    //your code 
#endif 
} 

này sẽ không được tối ưu hóa ra, tuy nhiên:

partial void DoSomethingIfCompFlag(); 

#if COMPILER_FLAG 
partial void DoSomethingIfCompFlag() { 
    //your code 
} 
#endif 

Phương pháp trống đầu tiên là một phần, và trình biên dịch C# 3 sẽ tối ưu hóa nó.


Bằng cách này: về cơ bản đây là phương pháp một phần cơ bản. Microsoft đã bổ sung thêm các trình tạo mã cho các nhà thiết kế LINQ của họ cần phải gọi các phương thức mà theo mặc định không làm gì cả.

Thay vì buộc bạn quá tải phương pháp, bạn có thể sử dụng một phần.

Bằng cách này các partials được tối ưu hóa hoàn toàn nếu không được sử dụng và không có hiệu suất bị mất, thay vì thêm phí trên của cuộc gọi phương thức trống thêm.

+1

Sử dụng thuộc tính [Có điều kiện ("COMPILER_FLAG")] sẽ có tác dụng tương tự và có thể dễ sử dụng hơn một chút. Xem http://msdn.microsoft.com/en-us/library/4xssyw96.aspx – Eric

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