f#编译速度太慢

use*_*057 19 f# visual-studio

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

printfn "Hello World"
let _ = System.Console.ReadLine()
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ste*_*orf 40

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

通常,Visual Studio安装应该确保一切都变得NGEN,但也许出了点问题.您可以在具有管理员权限的控制台窗口中使用以下命令检查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
Run Code Online (Sandbox Code Playgroud)

如果结果显示本机映像fsc.exe仍处于挂起状态,则可以强制编译:

c:\windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe executeQueuedItems
Run Code Online (Sandbox Code Playgroud)

注意:我不确定您正在使用哪个版本的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认同)

Chr*_*ith 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中内置了一个Tuple <_>类型,但在使用CLha 2.0时,使用了FSharp.Core.dll中定义的元组类型.

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

  • 我认为你会发现类型推断通常会提高编译速度,因为解析比类型推断慢得多.OCaml肯定比大多数优化C++编译器和F#编译器快一个数量级. (3认同)

Bri*_*ian 5

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

  • 请注意,VS中典型的FSI工作流是将代码正常输入到VS文件中,然后突出显示片段并按alt-enter将它们发送到交互式窗口.如果你正在打字;; 或者直接在窗口中输入,您不是最典型的工作流程. (7认同)