2015-04-10 2 views
11

Основываясь на богатом богатстве stackoverflow, я получал ответы на вопрос о том, выполняется ли рекурсивная оптимизация хвоста специально для кода C#. Некоторые из вопросов, как представляется, говорить оC# компиляция с хвостовой рекурсивной оптимизацией?

  1. спекуляция оптимизации в новых версиях .NET, которые были выпущены
  2. Строительство применение в качестве приложения x64bit для достижения оптимизации
  3. Переключение из отладочных к выпуску сборки в Visual Studio для достижения оптимизации
  4. Никакой оптимизации вообще и что сообщество Microsoft не утверждало, что они не будут выполнять рекурсивную оптимизацию хвоста для «проблем безопасности» (на самом деле это не понимало)
  5. Это happe нс по случайному

Так, как в C# 4.0 (Visual Studio 2013/2015) как можно обеспечить хвост рекурсивной оптимизации, если один может обеспечить его на всех?

+3

Это обычно добавляет большую ценность этим сообщениям, когда вы связываете другие вопросы и ответы, с которыми вы сталкивались, чтобы мы могли следить за вашим поездом мысли и пути, которые вы предприняли для достижения вашего вопроса. –

+1

Текущая версия C# равна 5, версия 6 доступна в предварительном просмотре VS 2015. –

+0

@TravisJ Я собирался попытаться связать другие вопросы, но не был уверен, смогу ли я отследить их по б/с. Я просмотрел их в течение значительного периода времени. –

ответ

19

Существуют различные уровни, на которых может поддерживаться оптимизация вызовов хвоста. JIT действительно несет ответственность за многие оптимизации, которые происходят. Сам компилятор C# даже не выполняет метод inline, то есть ответственность компилятора JIT. Компилятор C# может использовать Tailcall IL opcode, обозначающий вызов как хвостовой вызов, однако я считаю, что никакая версия компилятора C# не делает этого. Компилятору JIT разрешено выполнять оптимизацию хвостовых вызовов всякий раз, когда он сочтет нужным. В частности, я считаю, что только 64-разрядная JIT делает это. В этом blog post описывается ряд сценариев, в которых JIT64 не может использовать оптимизацию хвостовых вызовов. Я уверен, что критерии могут быть изменены, поскольку они работают над переписыванием JIT-компилятора под кодовым названием RyuJIT.

Если вы хотите небольшой пример программы, которые могут использовать TCO попробовать это:

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

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

Установите проект создания Release/x64 (или AnyCPU без предпочитают 32-бит) и запустить без отладчика прилагается. Программа будет работать вечно. Если я не делаю все эти вещи, тогда я получаю исключение stackoverflow около 20947.

+1

Второе упоминание ссылок совпадает с первым. Вы имели в виду это? http://blogs.msdn.com/b/clrcodegeneration/archive/2009/05/11/tail-call-improvements-in-net-framework-4.aspx Также хорошая публикация: http://stackoverflow.com/ вопросы/15864670/generate-tail-call-opcode –

+0

@ Erti-ChrisEelmaa Исправлена ​​ссылка, на которую также ссылаются в сообщении, с которым вы связались. –

+0

Итак, чтобы оптимизировать хвостовую рекурсивную оптимизацию JIT-компилятором, установите его на 64-битную сборку? Кроме того, есть ли что-то непосредственное (ключевые слова, теги атрибутов), которые можно добавить, чтобы увеличить вероятность оптимизации? –

Смежные вопросы