Haskell软实时系统的现状

Haskell软实时系统的现状,haskell,garbage-collection,real-time,Haskell,Garbage Collection,Real Time,我正在考虑Haskell的软实时应用程序。我可能会使用演员,因为这是值得的。我想知道是否有人了解Haskell的实时状态。特别是GC暂停应用程序时出现的问题。我在谷歌上搜索了很多内容,发现了2年多前的大量讨论,但都不是最新的。以下是我找到的一些参考资料: 我读过的许多旧资料表明,(当时)情况被认为正在改善。是吗 甚至在2年多以前,也有一些评论建议可以对Haskell应用程序进行调优,以可靠地将GC暂停时间降低到一两毫秒。这看起来现实吗?你看过这些吗: 还有,看看 另外,我建议与论文作者

我正在考虑Haskell的软实时应用程序。我可能会使用演员,因为这是值得的。我想知道是否有人了解Haskell的实时状态。特别是GC暂停应用程序时出现的问题。我在谷歌上搜索了很多内容,发现了2年多前的大量讨论,但都不是最新的。以下是我找到的一些参考资料:

我读过的许多旧资料表明,(当时)情况被认为正在改善。是吗

甚至在2年多以前,也有一些评论建议可以对Haskell应用程序进行调优,以可靠地将GC暂停时间降低到一两毫秒。这看起来现实吗?

你看过这些吗:

  • 还有,看看
另外,我建议与论文作者联系(ISMM 2011)。

因此,对“实时”的关注是GC收集引入的延迟

GHC使用一个多核垃圾收集器(还有)。最初的开发目的是通过降低频繁停止全球同步的成本来提高多核性能(每个核),出于同样的原因,这也有利于软实时。但是,截至2013年,每个线程的本地堆尚未合并到主GHC中,尽管并行GC已被合并

对于一个游戏,你应该能够利用这一点,通过使用线程,从而减少停止世界本地收集的需要

对于长寿命对象,在全局堆中,仍然存在一些(ms)GC风险。但是,仔细分析,例如,将清除此处的障碍。我看到实时1080p视频通过GHC管理的网络堆栈流式传输,没有明显的GC暂停

即使没有这些调整,事情也“可能会成功”。Frag几乎不需要优化,而且在近10年前是软实时的

最后,有许多工具和GHC标志可以提高性能:

  • -获取最佳GC标志的图形分解
  • -(-Isecons)的选项可能很有用
还有编码:使用非固定类型(无GC),最小化惰性结构分配。以打包的形式保存长期存在的数据。测试和基准测试


我想你会没事的。

我没有遇到GC暂停的问题,只要你不在所有事情上都使用惰性列表,就不应该生成太多垃圾


然而,对于多线程应用程序来说,天空并不那么明亮。GHC仍然没有一个具有线程优先级的调度器,如果您使用线程进行繁重的后台处理,您可以很容易地耗尽事件循环。

GHC 8.2.1有一个名为Compact Regions的功能,这可能会有所帮助

据我理解,这似乎是一种半手动内存管理。 您可以将长寿命数据存储在压缩区域中,而垃圾收集器不会跟踪它。如果在压缩区域中有任何引用,则整个压缩区域将保持活动状态。一旦该区域中没有任何引用,它将被解除分配。如果对某个区域的内容进行功能更新,则可以在新区域中重新分配该区域,旧区域将被释放



我还没有看到GC暂停效果,例如xmonad或frag。分析工具很容易就足以确保您不会产生大量垃圾。不过,我对Haskell中的参与者有点担心,GHC线程的研究要好得多。我认为这个问题很难凭经验回答,但作为一个数据,我经常在相当标准的商品硬件上的软实时应用程序中看到亚毫秒gc暂停。我不熟悉GHC的stricness analysis()。我的理解是,在许多情况下,它会自动地严格限制事物,包括列表。(假设优化级别设置得足够高。)那么你是说我应该确保以这样一种方式进行编码,GHC可以在适当的情况下使事情变得严格?Don在哪个GHC版本中引入了每线程堆?GHC文档中是否有任何详细信息?(我尝试过谷歌搜索,但没有发现任何特别的东西)谢谢你提醒我再次访问这个网站。根据GHC状态报告,每线程GC保留在分支中,而不在主线中。我已经链接到报告和状态。