避免“分享”的好方法?

Posted

技术标签:

【中文标题】避免“分享”的好方法?【英文标题】:A good way to avoid "sharing"? 【发布时间】:2011-07-07 16:38:20 【问题描述】:

假设有人将这个简单的 Python 代码翻译成 Haskell:

def important_astrological_calculation(digits):
  # Get the first 1000000 digits of Pi!
  lucky_numbers = calculate_first_digits_of_pi(1000000)
  return digits in lucky_numbers

Haskell 版本:

importantAstrologicalCalculation digits =
  isInfixOf digits luckyNumbers
  where
    luckyNumbers = calculateFirstDigitsOfPi 1000000

在使用 Haskell 版本后,程序员惊讶地发现他的 Haskell 版本“泄漏”了内存 - 在第一次调用他的函数后,luckyNumbers 永远不会被释放。这很麻烦,因为该程序包含一些更相似的功能,而且所有这些功能消耗的内存都很大。

有没有简单优雅的方法让程序“忘记”luckyNumbers

【问题讨论】:

不优雅,但是如果添加-# NOINLINE importantAstrologicalCalculation #-会怎样? 最近有一个问题,问的显然是同样的事情,但使用了更高级的术语。你可能想看看它:***.com/questions/6090932/… 【参考方案1】:

在这种情况下,您的 pidigits 列表是一个常量(或“常量应用形式 ),GHC 可能会将其浮出,计算一次,并在用户之间共享。如果没有对 CAF 的引用,它将被垃圾回收。

现在,一般来说,如果您想要重新计算某些东西,请将其转换为函数(例如,通过添加一个虚拟的 () 参数)。有关 CAF 的链接问题中的示例:How to make a CAF not a CAF in Haskell?

【讨论】:

浮出会改变什么吗? ***.com/questions/6208006 创造了一个类似的情况,没有任何东西是常数..

以上是关于避免“分享”的好方法?的主要内容,如果未能解决你的问题,请参考以下文章

在Django中获取页面动态标题的好方法是啥?

分享一个免费的听书说书读书的好工具

手机上的好工具分享,不能错过的清爽视频编辑!

手机上的好工具分享,不能错过的清爽视频编辑!

基于微信小程序的好物分享系统ssm框架

产品经理的四个阶段(分享会笔记)