在应用程序的某些部分需要完全并行的情况下,F# 是否优于 C#?
我的主要语言是 C#,我正在编写一个应用程序,其中构建在应用程序 (C#) 之上的核心功能必须并且计划非常并行。
我在 F# 中实现这些类更好吗?
在应用程序的某些部分需要完全并行的情况下,F# 是否优于 C#?
我的主要语言是 C#,我正在编写一个应用程序,其中构建在应用程序 (C#) 之上的核心功能必须并且计划非常并行。
我在 F# 中实现这些类更好吗?
我会看看Microsoft正在开发的 Parallel Extensions 。
如果您只需要并行处理数据集,ParallelFX 非常方便。他们将在 C# 中手动执行此操作会很痛苦。
但是,如果代码有很多异步代码,那么 F# 的 async monad 会比在 C# 中实现的要容易得多。如果您正在查看大量 BeginXXX/EndXXX 或可怕的 XXXAsync/XXXCompletedEvent 代码,那么 F# 将是一个重大胜利。
否则,您将获得 F# 优于 C# 的一般收益。
有两种方法可以使事情并行化,它们都在 F# 中工作得很好。
正如 Josh 已经提到的,有一个 Parallel Extensions 库。这使得并行处理某些数据结构变得非常容易,尤其是您经常在 F# 中使用的不可变数据结构。因此,将并行扩展与 F# 相结合是正确的方法。这将在我即将出版的真实世界的 F# 书籍中讨论,但我正在提供源代码。这在第 14 章中有介绍,并且它的源代码应该很快就会提供。
对于某些问题,您可以使用消息传递并发,这是共享内存的一种有吸引力的替代方案。您可以在Don Syme 书中的免费章节中找到一些相关信息。我的书中也将介绍它(第 13 章和第 16 章)。
通过将消息传递并发与异步工作流相结合,您可以获得编写无法使用并行扩展轻松并行化的程序的绝佳方式(即它们需要共享一些信息并还使用异步非阻塞操作(例如从互联网下载) ))
根据 Luca Bolognese 的演示,易于实现并行是 F# 的强项之一。在大约 53 分钟的时候,它变得相当令人印象深刻。希望这个对你有帮助。 http://channel9.msdn.com/pdc2008/TL11/
总体而言,F# 与 C# 相比具有许多优势,并且这些优势在并行编程的上下文中发挥着同等作用,但 F# 编程语言并没有使它更适合并行编程。
特别是,有一个神话,即避免副作用和纯粹的功能是并行性的灵丹妙药,但这是无稽之谈。您可以让纯功能程序更轻松地燃烧更多内核,但在多核上获得具有竞争力的绝对性能和加速是一个未解决的问题。
As others have already said, you will almost certainly want to use the Task Parallel Library that is now part of .NET 4. Note that the Visual F# 2010 standard library includes several functions that use the TPL, such as Array.Parallel.map
.
F# 基本上没有副作用,所以是的,但您不想在其中实现 UI。另一方面,下一个版本的 C# 将通过 LINQ 内置大量并行功能。
您还必须权衡您的培训要求以及 F# 还不是 RTM 并且要到今年年底才会出现的事实。
F# 使某些方法更好(例如本机消息支持),但如果您最小化(或更好,消除)可变状态,您可以在 C# 中做到这一点。
正如其他答案中所指出的,.NET 库很快就会通过并行扩展以这种方式得到很大的提升。但是,如果您开始使用锁,这些将同样缺乏可伸缩性。