网络上是否有任何 C#/F# 性能比较来显示新 F# 语言的正确用法?
自然 F# 代码(例如函数式/不可变)比自然(命令式/可变面向对象)C# 代码慢。然而,这种 F# 比通常的 C# 代码要短得多。
显然,这是一个权衡。
另一方面,在大多数情况下,您可以实现与 C# 代码相同的 F# 代码性能。这通常需要以命令式或可变的面向对象风格进行编码,分析并消除瓶颈。您使用的工具与 C# 中使用的工具相同:例如.Net 反射器和分析器。
尽管如此,了解 F# 中一些会降低性能的高效率构造是值得的。根据我的经验,我见过以下案例:
引用(相对于类实例变量),仅在执行数十亿次的代码中
F# 比较 (
尾部调用——仅在编译器或.Net 运行时无法优化的某些情况下。正如评论中所述,取决于 .Net 运行时。
F# 序列比 LINQ 慢两倍。这是由于引用和使用 F# 库中的函数来实现 seq<_> 的转换。这个问题很容易修复,因为您可以用具有相同签名的使用 Linq、PLinq 或 DryadLinq 的模块来替换 Seq 模块。
元组,F# 元组是在堆上排序的类。在某些情况下,例如int*int 元组可能需要使用结构体。
分配,值得记住的是,闭包是一个类,使用 new 运算符创建,它会记住访问的变量。可能值得“解除”闭包,或者将其替换为显式将访问的变量作为参数的函数。
尝试使用内联来提高性能,尤其是对于通用代码。
我的经验是首先使用 F# 进行编码,然后仅优化重要的部分。在某些情况下,用 C# 编写慢速函数可能比尝试调整 F# 更容易。然而,从程序员效率的角度来看,在 F# 中启动/原型设计然后分析、反汇编和优化是有意义的。
最重要的是,由于程序设计决策,您的 F# 代码最终可能比 C# 慢,但最终可以获得效率。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)