我很好奇F#性能与C ++性能相比如何?
视应用而异。如果您在多线程程序中广泛使用复杂的数据结构,则F#可能是一个大赢家。如果您大部分时间都花在紧密的数字循环变异数组上,那么C ++的速度可能要快2-3倍。
案例研究:射线跟踪器我的基准测试在这里使用一棵树进行分层剔除和数字射线-球面交集代码以生成输出图像。该基准已有数年历史,多年来,C ++代码已进行了数十次改进,并被成千上万的人阅读。Microsoft的Don Syme设法编写了一个F#实现,该实现比用MSVC编译并使用OpenMP并行化时最快的C ++代码快。
我已经读到F#应该具有更高的可扩展性和更高的性能,但是与C ++相比,这种实际性能如何?
用F#开发代码比使用C ++更加容易和快捷,这适用于优化和维护。因此,当您开始优化程序时,如果使用F#而不是C ++,则相同的工作量将获得更大的性能提升。但是,F#是高级语言,因此,对性能的限制较低。因此,从理论上讲,如果您有无限时间花在优化上,那么您应该总是能够用C ++生成更快的代码。
当然,这与C ++优于Fortran和Fortran优于手写汇编程序具有相同的好处。
案例研究:QR分解这是LAPACK之类的库提供的线性代数的基本数值方法。参考的LAPACK实现是Fortran的2,077行。我用不到80行代码编写了一个F#实现,可以实现相同的性能水平。但是参考实现并不很快:像英特尔的数学内核库(MKL)这样的厂商调整的实现通常快10倍。值得注意的是,我设法很好地优化了F#代码超越使其性能了在英特尔硬件上运行的英特尔实施性能,同时将我的代码保持在150行以下的代码中,并且代码完全通用(它可以处理单精度和双精度,复杂甚至符号矩阵!):对于较高的薄矩阵,我的F#代码比Intel MKL快3倍。
请注意,此案例研究的目的并不是要让您的F#比供应商调整的库更快,而是,即使是像Intel这样的专家,如果他们仅使用低级语言也将错过有效的高级优化。我怀疑英特尔的数值优化专家未能充分利用并行性,因为他们的工具非常繁琐,而F#使其毫不费力。
浮点运算的效果如何?
性能类似于ANSI C,但是.NET无法使用某些功能(例如,舍入模式)。
它允许矢量指令吗
没有。
对优化编译器有多友好?
这个问题没有道理:F#是Microsoft专有的.NET语言,带有单个编译器。
它有多少内存占用空间?
一个空的应用程序在这里使用1.3Mb。
是否允许对内存局部性进行细粒度控制?
比大多数内存安全语言要好,但不如C语言好。例如,您可以通过将F#中的任意数据结构表示为“结构”来拆箱。
它是否具有用于分布式存储处理器(例如Cray)的容量?
取决于您所说的“能力”。如果可以在该Cray上运行.NET,则可以使用F#传递消息(就像下一种语言一样),但是F#主要用于台式机多核x86计算机。
在涉及大量处理的计算科学中,它具有哪些有趣的功能?
内存安全性意味着您不会遇到分段错误和访问冲突。.NET 4对并行性的支持很好。通过Visual Studio 2010中的F#交互式会话即时执行代码的功能对于交互式技术计算非常有用。
是否有使用它的实际科学计算实现?
我们的商业产品在F#中用于科学计算的已经有数百个用户。
但是,您的疑问线表明您将科学计算视为高性能计算(例如Cray),而不是交互式技术计算(例如MATLAB,Mathematica)。F#用于后者。