繁体   English   中英

C#/ F#性能比较

[英]C# / F# Performance comparison

Web上是否有可用的C#/ F#性能比较,以显示新F#语言的正确用法?

自然F#代码(例如,函数/不可变)比自然(命令性/可变对象的)C#代码慢。 但是,这种F#比通常的C#代码短得多。 显然,有一个权衡。

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

话虽如此,但要注意F#中的一些高效率构造会降低性能。 根据我的经验,我见过以下案例:

  • 引用(与类实例变量相对),仅在执行数十亿次的代码中

  • F#比较(<=)与System.Collections.Generic.Comparer,例如二进制搜索或排序

  • 尾调用 - 仅在某些情况下无法由编译器或.Net运行时优化。 如评论中所述,取决于.Net运行时。

  • F#序列比LINQ慢两倍。 这是由于引用和使用F#库中的函数来实现seq <_>的转换。 这很容易修复,因为你可以用一个使用Linq,PLinq或DryadLinq的相同签名来替换Seq模块。

  • 元组,F#元组是在堆上排序的类。 在某些情况下,例如int * int元组,它可能需要支付使用结构。

  • 分配时,值得记住的是,闭包是一个用new运算符创建的类,它记住了访问过的变量。 可能值得“解除”闭包,或者用一个明确地将被访问的变量作为参数的函数替换它。

  • 尝试使用内联来提高性能,尤其是通用代码。

我的经验是先用F#编码,然后只优化重要的部分。 在某些情况下,在C#中编写慢函数可能更容易,而不是尝试调整F#。 但是,从程序员效率的角度来看,在F#中启动/原型是有意义的,然后进行轮廓分析,反汇编和优化。

最重要的是,由于程序设计决策,您的F#代码最终可能比C#慢,但最终可以获得效率。

以下是与此主题相关的一些链接:

我似乎还记得罗伯特皮克林博​​客上的另一篇文章(或者是斯科特汉塞尔曼?),最后,因为两者都坐在同一个框架上,你可以从两者中获得相同的表现,但有时你必须'扭曲'这种语言的自然表达。 在我回忆的例子中,他不得不扭曲F#以获得与C#相当的性能......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM