Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在应用程序部分需要完全并行的情况下,F#是否比C#更好?_C#_.net_F#_Parallel Processing - Fatal编程技术网

在应用程序部分需要完全并行的情况下,F#是否比C#更好?

在应用程序部分需要完全并行的情况下,F#是否比C#更好?,c#,.net,f#,parallel-processing,C#,.net,F#,Parallel Processing,在应用程序部分需要完全并行的情况下,F#是否比C#更好 我的主要语言是C#,我正在编写一个应用程序,其中构建在应用程序之上的核心功能(C#)必须并且计划非常并行 在F#中实现这些类是否更好?我将研究由开发的并行扩展 F#基本上没有副作用,所以是的,但你不想在其中实现UI。另一方面,下一版本的C#via LINQ将内置大量并行功能 您还必须权衡您的培训需求,以及F#尚未成为RTM,而且要到今年年底才会成为RTM的事实。F#使某些方法更好(例如本机消息支持),但如果您最小化(或更好地消除)可变状态,

在应用程序部分需要完全并行的情况下,F#是否比C#更好

我的主要语言是C#,我正在编写一个应用程序,其中构建在应用程序之上的核心功能(C#)必须并且计划非常并行


在F#中实现这些类是否更好?

我将研究由开发的并行扩展

F#基本上没有副作用,所以是的,但你不想在其中实现UI。另一方面,下一版本的C#via LINQ将内置大量并行功能

您还必须权衡您的培训需求,以及F#尚未成为RTM,而且要到今年年底才会成为RTM的事实。

F#使某些方法更好(例如本机消息支持),但如果您最小化(或更好地消除)可变状态,您可以使用C#来实现


正如在其他答案中所指出的,.NET库将很快通过并行扩展以这种方式获得巨大的提升。但是,如果您开始使用锁,它们同样缺乏可伸缩性。

如果您只需要并行处理数据集,ParallelFX非常方便。在C#中手动操作会带来很多麻烦

但是如果代码中有很多异步代码,那么F#的异步monad会使它比C#中的代码简单得多。如果你看到很多BeginXXX/EndXXX或者可怕的XXXAsync/XXXCompletedEvent代码,那么F#将是一个重大的胜利


否则,您将获得F#对C#的一般增益

有两种方法可以使事情并行,这两种方法在F#中都非常有效

  • 正如Josh已经提到的,有一个并行扩展库。这使得并行处理某些数据结构变得非常容易,特别是在F#中经常使用的不可变数据结构。因此,将并行扩展与F#相结合是正确的方法。这将在我的讨论中讨论,但我正在提供。第14章介绍了这一点,其来源应尽快提供

  • 对于某些问题,您可以使用消息传递并发,这是共享内存的一个有吸引力的替代方案。你可以在一个免费的网站上找到一些关于这方面的信息。我的书(第13章和第16章)也会涉及到这一点

  • 通过将消息传递并发性与异步工作流相结合,您可以获得一种极好的方法来编写无法使用并行扩展轻松并行化的程序(即,它们需要共享一些信息,还需要使用异步非阻塞操作(例如从internet下载))


根据Luca Bolognese的演示,易于实现并行性是F#的优点之一。在大约53分钟的比赛中,它给人留下了深刻的印象。希望这有点帮助。

F#总体上比C#有许多优势,这些优势在并行编程环境中发挥着同等的作用,但F#编程语言并没有使其更适合并行编程

特别是,有一个神话认为,避免副作用和纯粹的功能性是并行性的灵丹妙药,但这是胡说八道。您可以使纯功能程序更容易燃烧更多内核,但在多核上获得具有竞争力的绝对性能和加速是一个尚未解决的问题


正如其他人已经说过的,您几乎肯定会希望使用任务并行库,它现在是.NET4的一部分。请注意,Visual F#2010标准库包含几个使用TPL的函数,例如
Array.Parallel.map

,我也这么认为。希望它能被支持到2010年的发行版中。手工编写这样的代码真的会让人联想到延续传递样式背后的思想异步是在C#下一个发行版中构建的。在并行编程环境中最小化或消除可变状态是个坏主意。@JonH:你确定是这个意思吗?大多数人会说,当您想要并发时,避免可变状态(因此需要锁)是一个好主意。在并发上下文中避免可变状态通常是一个好主意,因为它通常会大大简化解决方案。但并发性不是并行性,特别是并行性完全是关于吞吐量性能的,但消除状态通常不仅会严重降低吞吐量性能,还会增加缓存复杂性,并破坏多核上的可伸缩性。所以,纯度和并行性通常很好地结合在一起,但纯度和并行性很少能很好地结合在一起。@Abel,我希望它现在已经发展到RTM了。我的评论是三年前的!