C#/ F#性能比较

有没有在网上提供的C#/ F#性能比较来显示正确使用新的F#语言?

自然F#代码(例如function/不可变)比自然(命令式/可变式面向对象)C#代码慢。 但是,这种F#比平常的C#代码短得多。 显然,这是一个权衡。

另一方面,在大多数情况下,您可以实现F#代码的性能等于C#代码的性能。 这通常需要在命令或可变的面向对象的风格,configuration文件和消除瓶颈编码。 您可以使用您在C#中使用的相同工具:例如.Netreflection器和一个分析器。

话虽如此,但值得注意的是F#中的一些高生产力构造会降低性能。 根据我的经验,我看到以下情况:

  • 引用(与类的实例variables),只在代码执行数十亿次

  • F#比较(<=)与System.Collections.Generic.Comparer,例如在二进制search或sorting

  • 尾调用 – 只有在某些情况下不能被编译器或.Net运行时优化。 如注释中所述,取决于.Net运行时。

  • F#序列比LINQ慢两倍。 这是由于引用和使用F#库中的函数来实现seq <_>的翻译。 这是很容易解决的,因为你可能会使用Linq,PLinq或者DryadLinq来代替Seq模块。

  • 元组,F#元组是一个在堆上sorting的类。 在某些情况下,例如一个int * int元组,它可能会付出使用结构。

  • 分配,值得记住的一个闭包是一个类,由新的操作符创build,它记住了访问的variables。 这可能是值得“解除”封闭,或者用一个显式地将访问variables作为参数的函数replace它。

  • 尝试使用内联来提高性能,特别是对于通用代码。

我的经验是首先在F#中编写代码,只优化重要的部分。 在某些情况下,在C#中编写慢速函数可能更容易,而不是试图调整F#。 不过,从程序员效率的angular度来看,在F#启动/原型,然后configuration文件,反汇编和优化。

底线是,由于程序devise的决定,你的F#代码可能会比C#慢,但是最终可以获得效率。

看到我最近问到的这些问题:

  • 程序F#比C#更高效(执行方式)吗?
  • 我如何在现实世界中使用函数式编程?
  • F#将来可能比其他.Net语言更优化吗?

以下是有关(或与此相关)的几个链接:

我似乎记得在Robert Pickering的博客(或者是Scott Hanselman的博客)上的另一篇文章中说到最后,因为两个人都坐在同一个框架上,你可以从两个人那里得到同样的performance,但是有时你必须“扭曲“这样做的语言的自然expression。 在我记得的例子中,他不得不扭曲F#来获得与C#相媲美的性能。