我很好奇 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 实现是 2,077 行 Fortran。我用不到 80 行代码编写了一个 F# 实现,实现了相同的性能水平。但参考实现并不快:英特尔的数学内核库 (MKL) 等供应商调整的实现通常快 10 倍。值得注意的是,我设法优化了我的 F# 代码,远远超出了在英特尔硬件上运行的英特尔实现的性能,同时将我的代码保持在 150 行代码以下并且完全通用(它可以处理单精度和双精度,以及复杂甚至符号矩阵!):对于高薄矩阵,我的 F# 代码比英特尔 MKL 快 3 倍。
请注意,本案例研究的寓意并不是您应该期望您的 F# 比供应商调整的库更快,而是如果他们只使用较低级别的语言,即使是英特尔这样的专家也会错过高效的高级优化。我怀疑英特尔的数值优化专家未能充分利用并行性,因为他们的工具使其极其繁琐,而 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# 适用于后者。