我喜欢F#,我真的非常喜欢。在被“函数式编程”()-bug咬伤之后,我强迫自己在有机会的时候使用它。事实上,我最近(在一个星期的假期期间)用它来做一种很好的人工智能算法。
然而,到目前为止,我的尝试(见一个与我第一次尝试这里相关的问题)似乎表明,尽管无疑是美丽的.F#的执行速度是我使用过的所有语言中最慢的。
我的代码做错了什么吗?
我详细地解释了我在我的博客帖子中所做的事情,在我的实验中,我看到OCaml和其他团队的运行速度比F#快5倍到35倍。
难道只有我有这样的经历吗?我感到沮丧的是,我最喜欢的语言,也是最慢的语言
编辑:直接GitHub链接,代码所在的地方在各种语言形式.
EDIT2:多亏了托马斯和丹尼尔,速度有了很大的提高:
EDIT3:乔恩·哈洛普博士加入了战斗: 60%的加速,让ScoreBoard直接操作“枚举”版本的数据。F#的命令式版本现在运行速度比C++慢3-4倍,这对于基于VM的运行时来说是一个很好的结果。我认为问题解决了-谢谢各位!
EDIT4:在合并所有优化之后,这些结果(F#达到C#的命令样式--现在,如果我也能对功能风格做些什么就好了!)
发布于 2011-07-22 19:07:51
除非您能够给出一个合理大小的代码示例,否则很难判断。无论如何,命令式F#版本应该与命令式C#版本一样高效。我认为一种方法是对两者进行基准测试,看看是什么导致了差异(然后有人可以帮助使这两者变得更快)。
我简要地查看了您的代码,下面是一些分类(未经测试)的建议。
Cell (这意味着您将使用值类型和整数比较,而不是引用类型和运行时类型测试):
型细胞= Orange =1\x{e76f}黄色=2\x{e76f}贫瘠=3inline。例如:
设内联myincr (arr:int数组) idx = arr.idx <- arr.idx +1for循环替换为while循环和可变标志,也可以使用尾递归函数(将尾递归函数编译为循环,因此即使在命令式解决方案中)也是有效的。发布于 2011-07-22 18:35:35
这本身并不是一个答案,但您是否尝试过用F#和C#编写完全相同的代码,即命令式F#代码?速度应该是相似的。如果你在比较简洁的函数代码和大量使用高阶函数,序列表达式,惰性值,复杂模式匹配等等--所有允许更短、更清晰(读更易维护)代码的东西--好吧,经常会有一种权衡。一般来说,开发/维护时间要比执行时间长得多,因此通常认为它是一种可取的权衡。
一些参考资料:
https://stackoverflow.com/questions/142985/is-a-program-f-any-more-efficient-execution-wise-than-c
另外要考虑的一点是:在函数式语言中,您的工作级别更高,因此很容易忽略操作的成本。例如,Seq.sort似乎是无辜的,但天真地使用它可能会影响性能。我建议仔细研究您的代码,并询问自己是否理解每个操作的成本。如果你没有思考,一个更快的方法是,当然,使用剖析器。
https://stackoverflow.com/questions/6794138
复制相似问题