使用函数式编程范式提高效率

4
由于函数式代码在定义上尽可能避免可变性,因此可以通过随时间展开先前的状态来编写有状态的程序。因此,我正在纯粹使用函数式风格编写F#游戏,当然游戏往往具有大量的状态。我基本上使用记录来表示游戏对象(例如玩家),并且简单地映射所有这些状态以获得下一个状态,这非常有效。但是,随着我的游戏越来越复杂,我担心由于每次更新都需要复制所有内容,它会变得缓慢。我想知道如何避免未来出现这些问题(目前还不是什么问题,虽然)。
那么,在函数式风格中是否有任何重要的优化可用于更改较小部分时不必复制大块数据?此外,F#是否具有我可以利用的与此类似的东西?
另外一件事-这里是我两个主要的问题,这可能甚至不是真的。我想弄清楚这些问题:
1. 垃圾收集。由于我每秒钟都要复制数千条记录,肯定会产生大量对象,而这些对象全部都是非常短暂的,因为我只是扔掉旧状态。这似乎是游戏每秒或如此跳动的一个可能原因,虽然几乎不会被注意到。
2. F#是否有效地复制记录并更新所有字段?如果没有,我该如何提高效率?

1
这是一个非常广泛的问题。尝试每个问题集中于一个问题(最好是一些具体的问题--尝试编写一些慢的代码,然后询问如何更快地编写它,这样我们就有了具体的工作内容)。 - N_A
1
我会本地化您应用程序的热路径,将其与其余代码分离,然后使其内部可变。 - Oldrich Svec
1
不用担心,理解性是性能的主要障碍。作为第一次近似,任何可理解的代码都会比其他不可理解的代码更快,无论使用什么方法。当然,在充分测量时间之后,只有使用变异才能挤出最后一点果汁,但那应该是你最不必担心的事情。 - nicolas
1个回答

4

函数式编程是否使用了任何重要优化,而F#不能为我完成,特别是涉及到仅更改一小部分数据时复制大块数据的情况?

你真的在复制“大块数据”吗?

通常,不可变数据结构的优点在于它们无需被复制。例如,如果您有一个函数式地图,您可以“更新”某些数据,但大多数数据保持不变,并在旧地图、新地图以及地图本身的较大部分之间共享。


我认为不可变数据结构的优点在于你无法更改它们。但在某些情况下,你需要复制所有内容以获取下一个状态,否则你怎么能得到这个下一个状态呢? - Jwosty
@Jwosty,看看他说的话。未更改的数据在旧地图和新地图之间共享(列表也是如此),因此唯一不共享的位是您正在更改的位(无论如何都不会共享)。当然还有一些特殊情况(例如,更改列表的“错误”端)。 - Benjol
啊,我明白了。那么就没有太多需要担心的了! :) - Jwosty
1
@Jwosty 当你不使用函数式数据结构时,确实应该这样做。例如,结构体数组或类似的东西。 - Ingo
哈哈,我的项目三个月没有可变性,哈哈! - Jwosty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接