2015-04-10 20 views
11

Dựa trên sự giàu có phong phú của stackoverflow, tôi đã nhận được và tắt câu trả lời về việc liệu đuôi đệ quy tối ưu hóa được thực hiện để cụ thể C# mã. Một vài trong số các câu hỏi xuất hiện để nói vềC# biên dịch với đuôi đệ quy tối ưu hóa?

  1. Đầu cơ của việc tối ưu hóa trong các phiên bản mới hơn của .net mà đã được phát hành
  2. ứng dụng xây dựng như một ứng dụng x64bit để đạt được tối ưu hóa
  3. Chuyển từ một debug xây dựng để phát hành bản dựng trong Visual Studio để đạt được tối ưu hóa
  4. Không tối ưu hóa và cộng đồng microsoft đã tuyên bố rằng họ sẽ không tối ưu hóa đệ quy cho "vấn đề bảo mật" (không thực sự hiểu điều này)
  5. Nó vui vẻ ns theo ngẫu nhiên

Vì vậy, với C# 4.0 (Visual Studio 2013/2015) làm cách nào để đảm bảo tối ưu hóa đệ quy đuôi nếu người dùng có thể đảm bảo tính năng này?

+3

Nó thường bổ sung rất nhiều giá trị cho các bài đăng này khi bạn liên kết các câu hỏi và câu trả lời khác mà bạn gặp phải để chúng tôi có thể theo dõi chuyến tàu của bạn suy nghĩ và con đường bạn đã thực hiện để tiếp cận câu hỏi của bạn. –

+1

Phiên bản hiện tại của C# là 5, phiên bản 6 có sẵn trong bản xem trước VS 2015. –

+0

@TravisJ Tôi sẽ cố gắng liên kết các câu hỏi khác, nhưng không thực sự chắc chắn nếu tôi có thể theo dõi chúng xuống b/c Tôi đã xem chúng trong một khoảng thời gian đáng kể. –

Trả lời

19

Có các cấp độ khác nhau để tối ưu hóa cuộc gọi đuôi có thể được hỗ trợ. JIT thực sự chịu trách nhiệm cho rất nhiều tối ưu hóa xảy ra. Bản thân trình biên dịch C# thậm chí còn không làm phương thức nội tuyến, đó là trách nhiệm của trình biên dịch JIT. Trình biên dịch C# có thể sử dụng các Tailcall IL opcode chỉ định một cuộc gọi như một cuộc gọi đuôi, tuy nhiên tôi tin rằng không có phiên bản nào của trình biên dịch C# thực hiện điều này. Trình biên dịch JIT được phép thực hiện tối ưu hóa cuộc gọi đuôi bất cứ khi nào nó thấy phù hợp. Đặc biệt, tôi tin rằng chỉ có JIT 64-bit thực hiện điều này. Điều này blog post phác thảo một số kịch bản trong đó JIT64 không thể sử dụng tối ưu hóa cuộc gọi đuôi. Tôi chắc chắn rằng các tiêu chí có thể thay đổi kể từ khi họ đang làm việc trên một viết lại của trình biên dịch JIT, có tên mã là RyuJIT.

Nếu bạn muốn có một ví dụ ngắn của chương trình đó có thể sử dụng TCO thử điều này:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Test(1); 
    } 

    private static void Test(int i) 
    { 
     Console.WriteLine(i); 
     Test(i + 1); 
    } 
} 

Đặt Dự án xây dựng phát hành/x64 (hoặc AnyCPU w/o thích 32-bit) và bắt đầu mà không có sự debugger đính kèm. Chương trình sẽ chạy mãi mãi. Nếu tôi không làm tất cả những điều đó, thì tôi sẽ nhận được ngoại lệ stackoverflow khoảng 20947.

+1

Tham chiếu liên kết thứ hai giống như lần đầu tiên. Ý bạn là sao? http://blogs.msdn.com/b/clrcodegeneration/archive/2009/05/11/tail-call-improvements-in-net-framework-4.aspx Ngoài ra, bài đăng tốt: http://stackoverflow.com/ question/15864670/generate-tail-call-opcode –

+0

@ Erti-ChrisEelmaa Cố định liên kết, cũng được tham chiếu trong bài đăng bạn đã liên kết tới. –

+0

Vì vậy, để đảm bảo thậm chí có khả năng tối ưu hóa đệ quy đuôi của trình biên dịch JIT, hãy đặt nó thành bản dựng 64 bit? Ngoài ra, có bất kỳ điều gì tức thời (từ khóa, thẻ thuộc tính) mà người ta có thể thêm vào để tăng khả năng tối ưu hóa không? –

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