Подтвердить что ты не робот

F # компиляция слишком медленная

Я новичок в f #. Я загрузил оболочку Visual Studio 2010 и файл F # ctp и написал маленький мир приветствия script со следующим кодом

printfn "Hello World"
let _ = System.Console.ReadLine()

Для компиляции занимает около 13-15 секунд, что очень медленно по сравнению с запуском аналогичного С# script (который занимает около 2 секунд). Я бы хотел, чтобы F # script скомпилировался быстрее, так что мое время разработки (то есть экспериментирование) было бы уменьшено, я не забочусь о производительности во время выполнения.

Есть ли способ сделать F # script быстрее компиляции, возможно, включить/выключить некоторые настройки сборки в Visual Studio или что-то в этом роде?

FYI, я использую 4-летнюю версию pentium 4, 1.5 gb RAM, если это помогает.

4b9b3361

Ответ 1

Я не знаю, как быстро Pentium 4 должен скомпилировать эту программу "hello world", но 15 секунд поражают меня довольно медленно. У меня когда-то были проблемы со скоростью с VS 2010 Beta, и проблема оказалась в том, что Visual Studio и компилятор F # еще не были должным образом NGENed.

Обычно установка Visual Studio должна обеспечивать, чтобы все получилось NGENed, но, возможно, что-то пошло не так. Вы можете проверить, был ли компилятор F # NGENed следующей командой в окне консоли с правами администратора:

cd "C:\Program Files\FSharp-2.0.0.0\bin"
c:\windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe display fsc.exe

Если результат этого показывает, что нативный образ fsc.exe все еще находится на рассмотрении, вы можете заставить компиляцию с помощью:

c:\windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe executeQueuedItems

Примечание. Я не знаю, какую версию компилятора F # вы используете точно. Тот, который используется для полной установки VS2010, используется в C:\Program Files\Microsoft F#\v4.0 (или C:\Program Files (x86)\Microsoft F#\v4.0 на 64-битных машинах). Итак, если вы используете этот, вы должны cd в эту папку вместо папки C:\Program Files\FSharp-2.0.0.0\bin.

Ответ 2

К сожалению, вы ничего не можете сделать - компилятор F # работает медленнее, чем компилятор С#. Но позвольте мне объяснить, почему:

Почему компилятор F # медленнее, чем компилятор С#

Во-первых, компилятор F # написан на .NET, компилятор С# написан на С++. Хотя это само по себе не является смертным приговором к перфомансу, это имеет значение. Во-вторых, компилятор С# старше 10 лет. Было много времени для его настройки и оптимизации - как самого компилятора, так и среды выполнения .NET. Механизм .NET JIT был настроен для С#/VB.NET, а не F #. Для функционального программирования требуется много короткоживущих объектов, что приводит к поведению типа GC.

Но реальная причина, почему компилятор F # заметно медленнее, чем компилятор С#, потому что он выполняет больше работы, чем компилятор С#. В С# вы предоставляете всю информацию о типе, которая в некотором смысле выполняет работу для компилятора. F #, с другой стороны, делает вывод типа для вас, что, экономя вас от бремени аннотации, требует дополнительного времени процессора.

Что вы можете сделать

Я рекомендую вам загрузить оболочку Visual Studio 2008 и использовать F # для таргетинга .NET Framework 2.0. Если вам не требуется что-то, что есть только в Visual Studio 2010 или CLR 4.0, вы будете в курсе Visual Studio 2008. Язык F # точно так же работает. Единственная разница, IIRC, заключается в том, какие типы компилируются. Например, существует тип Tuple < _ > , встроенный в CLR 4.0, но при таргетинге на CLR 2.0 используется тип кортежа, определенный в файле FSharp.Core.dll.

Visual Studio 2010 предлагает множество глазок и свистов, таких как редактор кода на основе WPF. Тем не менее, эти тонкости потребляют много оперативной памяти, и в вашем случае это звучит так, как будто вы можете жить без них.

Ответ 3

Обратите внимание, что вы можете использовать F # Interactive для оценки фрагментов кода или сценариев, а так как окно FSI в VS остается открытым, оно намного быстрее (время запуска для fsc.exe плохо).