f#编译速度太慢

时间:2011-01-15 03:25:09

标签: visual-studio f#

我是f#的新手。我下载了Visual Studio 2010 shell和F#ctp,并使用以下代码编写了一个小的hello world脚本

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

这需要大约13到15秒的时间来编译,这与运行类似的C#脚本(大约需要2秒)相比非常慢。我希望F#脚本能够更快地编译,这样我的开发(即实验)时间就会缩短,我不关心运行时性能。

有没有办法让F#脚本编译得更快,可能在Visual Studio中打开/关闭某些Build设置或类似的东西?

仅供参考,我使用4年前的奔腾4,1.5 GB RAM机器,如果有帮助的话。

3 个答案:

答案 0 :(得分:39)

我不知道Pentium 4应该如何快速编译“hello world”程序,但是15秒让我觉得很慢。我曾经遇到类似VS 2010 Beta的速度问题,问题是Visual Studio和F#编译器还没有正确地进行NGEN。

通常,Visual Studio安装应该确保一切都变得NGEN,但也许出了点问题。您可以在具有管理员权限的控制台窗口中检查F#编译器是否已使用以下命令进行NGEN:

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(或64位计算机上的C:\Program Files (x86)\Microsoft F#\v4.0)。因此,如果您使用该文件夹,则必须cd进入该文件夹而不是C:\Program Files\FSharp-2.0.0.0\bin文件夹。

答案 1 :(得分:6)

不幸的是,你无能为力--F#编译器比C#编译器慢。但让我解释一下原因:

为什么F#编译器比C#编译器慢

首先,F#编译器是用.NET编写的,C#编译器是用C ++编写的。 虽然这不仅仅是对perf的死刑判决,但确实有所作为。其次,C#编译器已有10年以上的历史。 很多时间来调整和优化它 - 编译器本身和.NET运行时。 .NET JIT引擎已针对C#/ VB.NET而非F#进行了微调。函数式编程需要大量短期对象,这些对象转换为不同类型的GC行为。

但是F#编译器明显比C#编译器慢的真正原因是因为它比C#编译器做更多的工作。在C#中,您提供了所有类型信息,这在某种程度上是您为编译器工作的。另一方面,F#为您进行类型推断,这样可以节省注释负担,但需要额外的CPU时间。

你能做什么

我建议您下载Visual Studio 2008 shell并使用F#定位.NET Framework 2.0。除非您只需要Visual Studio 2010或CLR 4.0中的某些内容,否则您可以在Visual Studio 2008上使用.F#语言的功能完全相同。唯一的区别,IIRC,是某些事物编译的类型。例如,有一个元组< _>类型内置于CLR 4.0中,但在定位CLR 2.0时,使用FSharp.Core.dll中定义的元组类型。

Visual Studio 2010提供了许多光滑的口哨和口哨,例如基于WPF的代码编辑器。然而,这些细节消耗了大量的RAM,在你的情况下,听起来你可以没有它们。

答案 2 :(得分:5)

另请注意,您可以使用F#Interactive来评估代码或脚本的片段,并且由于VS中的FSI窗口保持打开状态,因此速度要快得多(fsc.exe的启动时间很短)。