【问题标题】:How efficient can Haskell state be compared to C++, for very stateful games/simulations?对于非常有状态的游戏/模拟,Haskell 状态与 C++ 相比效率如何?
【发布时间】:2013-03-06 17:03:04
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

  • 我认为这个问题太宽泛了。您需要有一个您认为可能有问题的具体示例。
  • @DonStewart 这个问题更多是关于确保 Haskell 非常适合我想要做的事情之前开始数周的学习花哨的 monad 等,以便组合一个基准。对不起,含糊不清!不过,您的回答让我觉得给 Haskell 一个机会,所以毫无疑问,我将来会带着更具体的问题回来。

标签: performance haskell


【解决方案1】:

目前无法直接回答您的问题。

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


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

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

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

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

只要你的算法是合理的,你就可以了。

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

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

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

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

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

【讨论】:

  • 感谢您的出色回复,尽管我的问题含糊不清。一些后续: 1. 你说使用不可变数据没有固有的惩罚:这是否意味着,例如,更新大型不可变数据结构中的一个值与简单的破坏性更新大致一样有效? 2. 我读到 GHC 的“停止一切”垃圾收集器偶尔会丢帧,这是一个问题。这是一个有效的担忧吗?谢谢!
  • 更新不可变结构中的值可能比“类似”的临时/可变结构成本更高。我的观点是,如果这是一个问题,您可以使用可变结构。我没有看到 stop-the-world 的问题——GHC 被用于一些高频交易平台——所以这不是我最关心的问题。
  • 我会更担心幼稚的设计——例如使用不可变列表而不是可变数组——这将具有可怕的复杂性。使用相似的算法和相似的数据类型,您将获得相似的性能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多