C#/ F#性能比较

时间:2020-03-06 14:49:45  来源:igfitidea点击:

网上是否有任何C#/ Fperformance比较可以显示新语言的正确用法?

解决方案

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

  • F#程序是否比C#效率更高(在执行方面)?
  • 如何在现实世界中使用函数式编程?
  • 将来是否有可能比其他.Net语言对F#进行更多的优化?

以下是与此主题相关(或者相关)的一些链接:

  • http://cs.hubfs.net/forums/thread/3207.aspx
  • http://strangelights.com/blog/archive/2007/06/17/1588.aspx
  • http://khigia.wordpress.com/2008/03/30/ocaml-vs-f-for-big-integer-surprising-performance-test/
  • http://cs.hubfs.net/blogs/f_team/archive/2006/08/15/506.aspx
  • http://blogs.msdn.com/jomo_fisher/

我似乎还记得罗伯特·皮克林(Robert Pickering)博客上的另一篇文章(或者是斯科特·汉塞尔曼(Scott Hanselman?)),最后,由于两者都位于同一个框架上,因此我们可以从两者获得相同的性能,但是有时我们必须"扭转"语言的自然表达是这样做的。在我记得的示例中,他不得不扭动Fto才能获得与C#相当的性能。

自然Fcode(例如功能/不可变)比自然(命令式/可变的面向对象)Ccode慢。但是,这种Fis比通常的Ccode短得多。
显然,需要权衡取舍。

另一方面,在大多数情况下,我们可以获得的Fcode性能等于Ccode的性能。这通常将需要以命令式或者可变的面向对象样式进行编码,概要分析并消除瓶颈。我们使用的工具与C#中使用的工具相同:例如.Net反射器和探查器。

话虽这么说,但值得一提的是要注意F中一些会降低性能的高生产率构造。根据我的经验,我看到以下情况:

  • 引用(与类实例变量相比),仅在执行数十亿次的代码中
  • F#比较(<=)与System.Collections.Generic.Comparer的比较,例如在二进制搜索或者排序中
  • 尾调用-仅在某些情况下无法通过编译器或者.Net运行时进行优化。如注释中所述,取决于.Net运行时。
  • F#序列的速度比LINQ慢两倍。这是由于引用和使用F#库中的函数来实现seq <_>的转换所致。这很容易修复,因为我们可以用具有使用Linq,PLinq或者DryadLinq的相同签名的模块替换Seq模块。
  • 元组,F#元组是在堆上排序的类。在某些情况下,例如一个int * int元组,可能需要使用一个结构。
  • 分配时,值得记住的是,闭包是一个由new运算符创建的类,该运算符会记住访问的变量。可能值得"提起"闭包,或者用显式将访问的变量作为参数的函数替换它。
  • 尝试使用内联来提高性能,尤其是对于通用代码。

我的经验是使用Ffirst进行编码,并仅优化重要的部分。在某些情况下,在Crather中编写慢速函数来尝试调整F#可能会更容易。但是,从程序员效率的角度来看,在Fthen配置文件中启动/原型,分解和优化是有意义的。

最重要的是,由于程序设计决策的原因,Fcode最终运行速度可能会比Ccode慢,但最终可以获得效率。