首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >F#似乎比其他语言慢..。我能做些什么来加快速度?

F#似乎比其他语言慢..。我能做些什么来加快速度?
EN

Stack Overflow用户
提问于 2011-07-22 17:59:11
回答 2查看 4.6K关注 0票数 29

我喜欢F#,我真的非常喜欢。在被“函数式编程”()-bug咬伤之后,我强迫自己在有机会的时候使用它。事实上,我最近(在一个星期的假期期间)用它来做一种很好的人工智能算法

然而,到目前为止,我的尝试(见一个与我第一次尝试这里相关的问题)似乎表明,尽管无疑是美丽的.F#的执行速度是我使用过的所有语言中最慢的。

我的代码做错了什么吗?

我详细地解释了我在我的博客帖子中所做的事情,在我的实验中,我看到OCaml和其他团队的运行速度比F#快5倍到35倍。

难道只有我有这样的经历吗?我感到沮丧的是,我最喜欢的语言,也是最慢的语言

编辑:直接GitHub链接,代码所在的地方在各种语言形式.

EDIT2:多亏了托马斯和丹尼尔,速度有了很大的提高:

  • 最大的速度提升:从“裁判”向“可变”的移动给出了惊人的30%。
  • 删除异常并使用时间/标记检查会给出另外16%的效果。
  • 从受歧视的工会转到议会的比例又增加了5%。
  • “内联”给予0.5%-1%

EDIT3:乔恩·哈洛普博士加入了战斗: 60%的加速,让ScoreBoard直接操作“枚举”版本的数据。F#的命令式版本现在运行速度比C++慢3-4倍,这对于基于VM的运行时来说是一个很好的结果。我认为问题解决了-谢谢各位!

EDIT4:在合并所有优化之后,这些结果(F#达到C#的命令样式--现在,如果我也能对功能风格做些什么就好了!)

  • 真实的0m0.221 s:那是C++
  • 真实的0m0.676:那是C# (命令式,C++镜像)
  • 真实的0m0.704:那是F# (命令式,C++镜像)
  • 真实的0m0.753:那是OCaml (命令式,C++镜像)
  • 真实的0m0.989:那是OCaml (功能)
  • real 0m1.064:那是Java (命令式)
  • 真实的0m1.955:那是F# (功能)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-22 19:07:51

除非您能够给出一个合理大小的代码示例,否则很难判断。无论如何,命令式F#版本应该与命令式C#版本一样高效。我认为一种方法是对两者进行基准测试,看看是什么导致了差异(然后有人可以帮助使这两者变得更快)。

我简要地查看了您的代码,下面是一些分类(未经测试)的建议。

  • 您可以用枚举替换受歧视的联合Cell (这意味着您将使用值类型和整数比较,而不是引用类型和运行时类型测试): 型细胞= Orange =1\x{e76f}黄色=2\x{e76f}贫瘠=3
  • 您可以将一些简单的函数标记为inline。例如: 设内联myincr (arr:int数组) idx = arr.idx <- arr.idx +1
  • 不要对控制流使用异常。这通常是在OCaml中完成的,但是.NET异常很慢,应该只用于异常。您可以将示例中的for循环替换为while循环和可变标志,也可以使用尾递归函数(将尾递归函数编译为循环,因此即使在命令式解决方案中)也是有效的。
票数 17
EN

Stack Overflow用户

发布于 2011-07-22 18:35:35

这本身并不是一个答案,但您是否尝试过用F#和C#编写完全相同的代码,即命令式F#代码?速度应该是相似的。如果你在比较简洁的函数代码和大量使用高阶函数,序列表达式,惰性值,复杂模式匹配等等--所有允许更短、更清晰(读更易维护)代码的东西--好吧,经常会有一种权衡。一般来说,开发/维护时间要比执行时间长得多,因此通常认为它是一种可取的权衡。

一些参考资料:

F#和C#的CLR是一样的,那么为什么F#比C#快呢?

C# / F#性能比较

https://stackoverflow.com/questions/142985/is-a-program-f-any-more-efficient-execution-wise-than-c

另外要考虑的一点是:在函数式语言中,您的工作级别更高,因此很容易忽略操作的成本。例如,Seq.sort似乎是无辜的,但天真地使用它可能会影响性能。我建议仔细研究您的代码,并询问自己是否理解每个操作的成本。如果你没有思考,一个更快的方法是,当然,使用剖析器。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6794138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档