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语言更优化吗?
以下是有关(或与此相关)的几个链接:
- 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的博客)上的另一篇文章中说到最后,因为两个人都坐在同一个框架上,你可以从两个人那里得到同样的performance,但是有时你必须“扭曲“这样做的语言的自然expression。 在我记得的例子中,他不得不扭曲F#来获得与C#相媲美的性能。