8

我似乎无法找到有关该主题的任何确凿信息。那里有很多 Haskell 游戏实现,但我发现的是小型游戏,尚不清楚它们的方法是否可扩展。同样,有很多关于在 Haskell 程序中拥有状态的信息(主要使用 State monad),但关于这些方法的效率是否与命令式语言中的状态相当的信息却很少。

我正在开发一个具有极其简单图形的模拟器,这使得在 Haskell 中进行开发对我来说非常理想。但是,我想模拟尽可能多的实体,这意味着效率非常重要。为了使用 Haskell,我会接受性能略有下降,但我担心这种模拟的有状态特性会使 Haskell 代码比我的其他选择 C++ 慢一个数量级。

正如标题所述,Haskell 如何比较这种类型的应用程序?非常感谢有关在 Haskell 中使用的方法的建议,以及指向已实现的有状态的高性能 Haskell 程序的链接。

如果需要一个更具体的示例来说明我需要如何维护状态,我可以提供一个,但只要考虑在每次迭代中都会发生广泛变化的大量坐标集合就足够了。

谢谢!

4

1 回答 1

11

就目前而言,您的问题无法直接回答。

TL;DR:没有理论上的原因会导致性能问题。而且当然不知道有“一个数量级”的性能差的原因。然而,除非你有一个具体的场景,否则很难做出宽泛的陈述。


Haskell 可以像 C++ 一样访问裸内存和随机播放位。因此,没有理论上的“慢数量级”需要关注。实际上,如果您希望将状态表示为可变的内存块、堆栈分配的帧或其他任何东西,Haskell(GHC 实现)支持这一点——毕竟有一些操作系统是用 Haskell 编写的。

在这方面有用的一些习语和库:

  • 未装箱的严格字段
  • ST monad(对原始内存的安全访问)
  • vector 和 repa 库——高性能向量

除非您正在编写设备驱动程序,否则您很可能不需要绝对的低级控制。

只要你的算法是明智的,你会没事的。

Haskell 的 GHC 实现具有非常快的分配(凹凸指针),使不可变数据变得便宜。使用不可变数据没有固有的损失,您可以获得更容易的并行化和更易于维护的代码。因此,如果可以,请坚持使用 Haskell 习语。

我想模拟尽可能多的实体,这意味着效率非常重要。

GHC 有一个非常高效的分配器和垃圾收集器,对象便宜且开销低——假设你使用合理的数据表示——所以我认为这里没有问题。例如,在基准测试游戏中,二叉树基准测试分配器性能——C++ 和 GHC Haskell在编写此微测试时并列。

最终,从根本上使用 Haskell 无需付出任何代价。您可以在必要时使用命令式算法——可能您不需要。只是不要犯使用幼稚算法的错误(例如使用不可变列表代替可变数组)。这是迄今为止最大的风险——作为一个新用户,你可能会使用低效的方法——寻求帮助和简介:)

顺便说一句,10 年前,一位新的 Haskell 用户编写了Frag,它的性能完全可以接受。GHC 现在也聪明多了……

于 2013-03-06T17:12:41.530 回答