【问题标题】:Is it possible to skip the nursery?可以跳过托儿所吗?
【发布时间】:2014-12-24 02:54:50
【问题描述】:

如果我知道某个值很可能在它与垃圾收集器的第一次相遇中幸存下来,有没有办法让 GHC 知道,所以它可以直接在 Nursery 之外的某个地方分配它?例如,如果我用一堆小块构建一个大结构,我知道每块至少会持续到整个结构完成。

【问题讨论】:

  • 作为一个小小的元评论:我讨厌这种问题,因为你总是想,“不,没有办法。”但在那之后的直接想法是,“好吧,我确定我对编译器并不了解一切(可能只有一两个人知道),而且由于它是开源的,当然有一个做任何可计算的事情的方法,但是......这不是一个真正的答案......”。有没有人有建设性的方式来回答这类问题?
  • 这个优化被称为“pretenuring”——已经有一些研究,但我不相信它被整合到任何主流编译器/运行时。
  • @DanielWagner,除了我可能错过的任何功能外,我想知道是否有一些棘手的方法可以利用 GHC 处理大型和/或异物的机制。我无法立即看到这样的东西,但我真的不熟悉这些系统。
  • @Zim-ZamO'Pootertoot 我相信“过早的任期”(你所链接的)描述了相反的情况,一种通过避免在第一次遇到 GC 时防止短期对象离开 Nursery 的机制任何与 GC 的相遇。这个问题要求一种机制让长寿命对象开始提升,以便第一次遇到 GC 时不需要提升它们。
  • @Cirdec 问题是我链接到的定义将 pretenuring 描述为一个问题(过早提升短期对象),而不是优化(早期提升长期对象) . This 是一篇将其描述为优化的论文,也是 this paper,但是 memorymanagement.org 链接是我能找到的唯一未嵌入论文的定义

标签: haskell garbage-collection ghc


【解决方案1】:

the GHC garbage collector 中没有用于提示对象应分配到的代的挂钩。但是,您可以通过以下几种方式利用操作行为:

  • 根据数据类型,您可以利用the pinned object region 完全绕过世代阶段。

  • 利用eager promotion,确保您的长寿对象被本身长寿的东西指出......

  • 将数据制作成a CAF,完全绕过动态分配。

【讨论】:

  • 不幸的是,我正在做的事情太多态而无法使用固定,并且将数据放入 CAF 通常不是一种选择。如果您编辑答案以进一步解释我如何欺骗急切的促销活动,我会很乐意接受这个答案。注意:我当前的用例是减少 Data.Sequence.fromList 的 GC 时间,这有点荒谬。
猜你喜欢
  • 2014-06-29
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多