我很好奇F#性能与C++性能相比如何?关于Java,我问了一个类似的问题,我得到的印象是Java不适合于繁重的数字运算。
我读到过F#应该具有更高的可伸缩性和更高的性能,但与C++相比,现实世界的性能又如何呢?有关目前执行情况的具体问题是:
谢谢
发布于 2010-05-05 15:29:43
发布于 2010-05-10 00:45:51
我很好奇F#性能与C++性能相比如何?
根据应用程序的不同,差异很大。如果您在多线程程序中广泛使用复杂的数据结构,那么F#很可能是一个巨大的胜利。如果你的大部分时间花在紧凑的数字循环中,变异数组,那么C++可能会更快2-3×。
案例研究:射线追踪器,我的基准这里,使用一棵树进行分层剔除和数值射线球相交代码,以生成输出图像。这个基准已经有好几年的历史了,C++代码在过去的几年里已经改进了几十次,并且被成千上万的人阅读。微软的Don成功地编写了一个F#实现,它比用MSVC编译并使用OpenMP并行化的最快的C++代码要快一些。
我读到过F#应该具有更高的可伸缩性和更高的性能,但与C++相比,现实世界的性能又如何呢?
使用F#开发代码比使用C++更容易和更快,这适用于优化和维护。因此,当您开始优化一个程序时,如果您使用F#而不是C++,那么同样的工作量将带来更大的性能收益。然而,F#是一种更高级的语言,因此对性能设置了更低的上限.因此,如果您有无限的时间用于优化,理论上,您应该始终能够在C++中生成更快的代码。
当然,这与C++对Fortran和Fortran对手写汇编程序的好处完全相同。
案例研究: QR分解,这是由LAPACK等库提供的线性代数的一种基本数值方法。参考LAPACK实现是2,077行Fortran。我用80行代码编写了一个F#实现,实现了相同的性能水平。但是参考实现并不快:供应商调优的实现,比如Intel的Math (MKL),通常要快10倍。值得注意的是,我成功地优化了我的F#代码,远远超出了英特尔硬件上运行的英特尔实现的性能,同时将我的代码保持在150行代码和完全通用代码(它可以处理单精度和双精度,甚至是符号矩阵!):对于超薄矩阵,我的F#代码比Intel快3×10。
请注意,这个案例研究的寓意并不是您应该期望您的F#比供应商调优库更快,而是,即使是像英特尔这样的专家,如果只使用低级语言,也会错过高效的高级优化。我怀疑英特尔的数值优化专家未能充分利用并行性,因为他们的工具使其极其繁琐,而F#则使其变得轻而易举。
它对浮点有多好?
性能与ANSI相似,但一些功能(例如舍入模式)在.NET中不可用。
它允许向量指令吗
不是的。
它对优化编译器有多友好?
这个问题没有意义: F#是微软的专有.NET语言,只有一个编译器。
它有多大的记忆脚印?
一个空应用程序在这里使用1.3Mb。
它允许对内存局部性进行细粒度控制吗?
比大多数内存安全语言都好,但不如C语言好,例如,您可以通过将任意数据结构表示为"structs“来解压缩F#中的任意数据结构。
它是否具有分布式内存处理器的能力,例如Cray?
取决于你所说的“能力”是什么意思。如果您可以在这个Cray上运行.NET,那么您可以使用F#中的消息传递(就像下一种语言一样),但是F#主要用于桌面多核x86机器。
在涉及重数处理的计算科学中,有哪些特性可能会引起人们的兴趣?
内存安全意味着您不会得到分段错误和访问冲突。.NET 4中对并行性的支持是很好的。在Visual 2010中通过F#交互式会话执行代码的能力对于交互式技术计算非常有用。
是否有实际使用它的科学计算实现?
我们的商业产品在F#中的科学计算已经有了数百个用户。
然而,您的提问线表明,您认为科学计算是高性能计算(例如Cray),而不是交互式技术计算(例如MATLAB、Mathematica)。F#是为后者设计的。
发布于 2010-05-02 09:48:47
除了其他人所说的,关于F#还有一点是很重要的,那就是并行性。普通F#代码的性能由CLR决定,尽管您可以从F#中使用LAPACK,或者可以使用C++/CLI作为项目的一部分进行本机调用。
然而,设计良好的功能程序更容易并行化,这意味着您可以通过使用多核CPU轻松地获得性能,如果您正在做一些科学的计算,这些CPU肯定对您是可用的。以下是几个相关链接:
关于分布式计算,您可以使用任何可用于.NET平台的分布式计算框架。有一个MPI.NET项目,它可以很好地与F#一起工作,但是您也可以使用DryadLINQ,这是一个MSR项目。
https://stackoverflow.com/questions/2752229
复制相似问题