【发布时间】:2015-08-08 19:17:54
【问题描述】:
我认为 Haskell 是一门漂亮的语言,从基准测试来看,它的实现可以生成快速代码。
但是,我想知道它是否适用于长期运行的应用程序,或者是否会追逐所有潜在的惰性引起的泄漏,人们可能会在短期应用程序中忽略这些泄漏,证明令人沮丧?
This Reddit comment 回应了我的担忧:
只要你有多个函数递归调用自身, 堆配置文件不再为您提供任何帮助来确定 正在发生泄漏。
(整个讨论似乎富有洞察力和坦率)
我个人对高性能计算很感兴趣,但我猜服务器和 HPC 有这个共同点。
如果 Haskell 适用于此类应用程序,是否有任何示例可以证明这一点,即应用程序
- 需要运行数天或数周,因此需要消除所有相关泄漏(程序花费在睡眠或等待某些底层 C 库返回的时间显然不算在内)
- 很重要(如果应用程序很简单,开发人员可以猜测泄漏源并尝试各种修复。但是,我不相信这种方法可以很好地扩展。堆配置文件在识别根据上面的 Reddit 讨论,具有多个 [相互] 递归函数的泄漏源似乎特别值得关注)
如果 Haskell 不适合此类应用程序,那为什么?
更新: Haskell 的 Yesod Web 服务器框架,作为示例提出,may have issues with memory。我想知道是否有人在连续几天服务请求后测试了它的内存使用情况。
【问题讨论】:
-
看起来有点像带有垃圾收集器的系统是否合适:因为
gc人们通常不会销毁不再需要的对象:他们认为 gc 会找到他们最终。但这可能会导致大量堆对象仅处于活动状态,因为引用未设置为null,从而使所有这些对象成为垃圾。 -
懒惰并不意味着空间泄漏,正如严格不意味着。管理这两种内存模型有不同的技术。您编写应用程序的方式决定了您的应用程序是否能够长时间运行。我知道Facebook is using Haskell 是多个数据存储和它们的一些前端服务之间的中间层,但我不知道这些是否是短暂的过程。我的猜测是它们需要长时间运行,所以如果是这种情况,你就会有一个非常可靠的例子。
-
@bheklilr:我不认为 MaxB 指的是空间泄漏:Haskell 正确管理内存(或者应该从理论上的 pov),但回收死对象可能需要很长时间。
-
@MaxB,你不能在 gc 语言中真正“删除所有垃圾”。我们正在谈论忘记设置对
null的某些引用,这与因为它们所引用的内容而不评估某些表达式非常相似。然而,与命令式程序相比,在 Haskell 程序中推理内存确实非常困难。你可以设计你的持久性数据结构,以保证它们没有未评估的 thunk——如果我正在编写一个大型系统,我可能会这样做。它确实限制了你的表达能力,但也为内存使用提供了一个检查点。 -
阅读:engineering.imvu.com/2014/03/24/what-its-like-to-use-haskell。似乎 Haskell 在长时间运行的服务中运行良好,但空间泄漏可能更难找到(尽管工具正在改进,所以我不知道现在有多难)。
标签: performance haskell memory-leaks functional-programming scientific-computing