哈斯克尔软实时电流状态(Current state of Haskell soft real-tim

2019-07-21 01:26发布

我考虑哈斯克尔的软实时应用。 我可能会用演员,对于它的价值。 我想知道如果任何人有洞察的实时哈斯克尔当前状态。 具体而言,与GC问题暂停的应用程序。 我用Google搜索广泛,我发现从2年以前的讨论,但没有当前的一个很大。 这里有几个我已经找到了引用:

使用哈斯克尔的相当大的实时系统:如何(如果?)?

如何为喜欢游戏软实时应用Haskell的GC性能?

很多旧的东西我读过表明,情况是(当时)认为有所改善。 有吗?

即使2+年前,有提示Haskell的应用提出一些看法,可以调整,以保持可靠的GC暂停下来一两毫秒。 这看起来现实吗?

Answer 1:

因此,对于“实时”值得关注的是由GC集合引入的等待时间。

GHC使用多核垃圾收集器(和有一个分支与每线程本地堆 )。 最初开发以提高性能multcore(每个内核可以独立收集通过减少频繁停了世界同步的成本),这恰好也是出于同样的原因受益软实时。 然而,由于2013年,每线程本地堆还没有被合并到主GHC,虽然并行GC已。

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

对于长期生活的对象,在全局堆,你还是有些风险(MS)GC。 然而,如仔细分析ThreadScope将在这里扫清障碍。 我见过实时通过GHC管理网络堆栈1080p视频流没有明显的GC暂停。

即使没有这些优化等,事情“可能只是工作”。 破片几乎不需要优化,近10年前,软实时现在。

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

  • GHC-GC调 -获得最佳的GC标志的图形击穿
  • 吞吐量建议
  • 对于选择垃圾收集 - (-Iseconds可能是有用的)

再有就是编码:使用未装箱的类型(无GC),减少懒惰结构分配。 保持长期居住数据围绕打包形式。 测试和基准。

我想你会没事的。



Answer 2:

你见过这些:

  • 在Haskell(2012年7月)垃圾收集的当前状态
  • 此外,检查出在拉姆达终极下面的讨论

另外,我建议接触的作者与本地堆多核垃圾回收纸(2011 ISMM)。



Answer 3:

我还没有遇到过的问题与GC暂停,只要你不使用惰性列表的一切,你不应该产生太多的垃圾。

天空是不是多线程应用程序如此明亮,但是。 GHC仍然没有与线程优先级调度,如果你使用线程重型后台处理,你可以很容易饿死的事件循环。



Answer 4:

GHC 8.2.1有一个称为紧凑型区域的功能,可能是有益的。

从我的理解,这似乎是一种半手工的内存管理。 您可以存储长期的数据在一个紧凑的区域和垃圾回收器不跟踪它。 如果有在紧凑型地区的任何东西任何引用,整个紧凑型地区保持活动状态。 一旦有在该地区没有任何引用,它会被释放。 如果您的功能更新区域的内容,你可以在一个新的区域重新分配它,旧的区域将被释放。

http://ezyang.com/compact.html
https://hackage.haskell.org/package/compact-0.1.0.1/docs/Data-Compact.html



文章来源: Current state of Haskell soft real-time