如果你正在做 traditional heavy computing,例如线性代数,各种各样的优化,那么你不应该把你的代码。Net 框架,至少不适合 F # 。因为这是在算法级别,所以大多数算法必须用命令式语言编写,以便在运行时间和内存使用方面有良好的性能。其他人提到了并行,我必须说,当您执行诸如并行 SVD 实现之类的低级工作时,它可能是无用的。因为当您知道如何并行 SVD 时,您就不会使用高级语言,Fortran、 C 或修改后的 C (例如 青菜)就是您的朋友。
我有一个使用 lbfGS 优化的大规模 Logit模型求解器,它是用 C + + 编写的。实现经过了良好的调优。我在 C + +/CLI 中修改了一些代码,也就是说,我将代码编译成。网。那个。Net 版本比在不同数据集上编译的初始版本慢3到5倍。如果您使用 F # 编写 LBFGS,那么性能不会比 C + +/CLI 或 C # 更好(但会非常接近)。
我还有一篇关于 为什么 F # 是数据挖掘的语言的文章,虽然与你在这里关心的性能问题没有太大关系,但是它与 F # 中的科学计算有很大关系。
根据应用程序的不同,变化很大。如果您在多线程程序中广泛使用复杂的数据结构,那么 F # 可能是一个很大的胜利。如果你的大部分时间都花在紧凑的数字循环变异数组上,那么 C + + 可能会快2-3倍。
案例研究: 光线跟踪器 我的基准 给你使用一个树来进行分层筛选,并使用数字光线-球面相交代码来生成输出图像。这个基准测试已经有好几年的历史了,C + + 代码在过去的几十年中已经被改进了几十次,并且被成千上万的人阅读。微软的 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 # 实现,这些代码达到了相同的性能水平。但是参考实现并不快: 像 Intel 的 Math Kernel Library (MKL)这样经过厂商调优的实现通常要快10倍。值得注意的是,我成功地优化了我的 F # 代码,超越在 Intel 硬件上运行的 Intel 实现的性能,同时保持我的代码在150行以下,并且完全通用(它可以处理单精度和双精度,以及复杂甚至符号矩阵: 对于高瘦矩阵,我的 F # 代码比 Intel MKL 快3倍。
请注意,这个案例研究的寓意并不是你应该期望你的 F # 比供应商调优的库更快,而是,即使像 Intel 这样的专家如果只使用低级语言,也会错过高效的高级优化。我怀疑英特尔的数值优化专家没有充分利用并行性,因为他们的工具使它非常笨重,而 F # 使它不费吹灰之力。
它的浮点运算能力如何?
性能类似于 ANSI C,但是一些功能(例如舍入模式)不能从.NET 获得。
它是否允许向量指令
没有。
它对优化编译器有多友好?
这个问题没有意义: F # 是微软的一种专有.NET 语言,只有一个编译器。
它的记忆足迹有多大?
一个空应用程序在这里使用1.3 Mb。
它是否允许对内存区域进行细粒度控制?
比大多数内存安全语言都要好,但是不如 C。例如,你可以用“ structs”来表示 F # 中的任意数据结构。
它是否具有分布式内存处理器的容量,例如 Cray?
这取决于你所说的“容量”是什么意思。如果你能跑的话。NET,然后你可以使用消息传递在 F # (就像下一种语言) ,但 F # 主要是为桌面多核 x86机器。
在涉及大量数字处理的计算科学中,它有哪些特性可能会引起研究人员的兴趣?
内存安全意味着不会出现分段错误和访问冲突。中对并行性的支持。NET 4很好。在 Visual Studio 2010中,通过 F # 交互式会话动态执行代码的能力对于交互式技术计算非常有用。
关于 F # ,大多数基准使用 Mono,它比 MS CLR 慢2 * ,部分原因是它使用了 boehm GC (他们有一个新的 GC 和 LVVM,但这些还不成熟,不支持泛型等)。
.NET 语言本身被编译成一个 IR (CIL) ,它可以像 C + + 一样高效地编译成本地代码。大多数 GC 语言都会遇到一个问题集,那就是大量的可变写操作(包括 C + +)。NET).有一个特定的科学问题集需要这样做,这些问题在需要的时候可能应该使用本地库或者使用享元模式来重用池中的对象(这样可以减少写操作)。原因是在。NET CLR,当更新引用字段(包括框)时,它将在表中设置一个位,表示该表已修改。如果您的代码包含大量这样的写操作,那么它将受到影响。
就是说。像 C # 这样的 NET 应用程序使用大量的静态代码、结构和结构上的 ref/out 可以产生类似 C 的性能,但是像这样编写代码或者维护代码(像 C)是非常困难的。
最后,我认为像 C # 、 F # 这样的高级语言和正确的分析在同样的开发时间内会比 c 和 C + + 给你更好的效果。如果您将瓶颈更改为 c lib paccess 调用,那么在关键领域也将得到与 C 类似的性能。也就是说,如果你有无限的预算,并且更关心速度,那么维护比 C 更好(而不是 C + +)。