Haskell中的有界计算

rwa*_*ace 8 haskell ghc

在Haskell中是否有任何方法(如果需要在Linux和Windows上运行的代码使用GHC来执行有界计算)?也就是说,"如果可行的话,计算此函数的结果,但如果尝试使用了超过X个CPU周期,Y堆栈空间或Z堆空间,但仍未完成,请停止并返回指示是不是可以完成计算"?

Lou*_*man 8

System.Timeout.timeout :: Int -> IO a -> IO (Maybe a)
Run Code Online (Sandbox Code Playgroud)

http://lambda.haskell.org/hp-tmp/docs/2011.2.0.0/ghc-doc/libraries/base-4.3.1.0/System-Timeout.html#v:timeout

  • @NathanHowell听起来他正在做一些跨架构的东西(因为他提到至少两个操作系统),所以小心"Int"对我来说很有意义.例如,现在,*没有用于Windows的64位GHC. (3认同)
  • 确实.我无法想象任何合理的内存语义 - 除了精确测量内存消耗的极端困难之外,如果有另一个不受内存限制的线程怎么办?如果您与其他线程共享某些值,该怎么办?谁"为此付出代价"?如何快速解决这些问题以获得测量结果而不会削弱正在运行的功能? (2认同)
  • 现在小心:`Int`在微秒时特别小.另请参见[unbounded-delays](http://hackage.haskell.org/package/unbounded-delays)包. (2认同)

Ale*_*rov 6

这是一个你可以尝试的hackish解决方案:用你的计算产生forkIO,让父线程(或者有权访问分叉线程的监视线程ThreadId)周期性地轮询你想要的任何数量,并向计算线程抛出异步异常必要时(有趣的是,这正是如何timeout运作的.)

接下来的问题是,是否有办法在Haskell中找出当前堆的大小.您可以通过生成shell命令或以其他方式查询操作系统来查找总内存消耗和周期(我不知道如何在Windows上执行此操作.)

它不是一个完美的解决方案,但它是一个简单的解决方案,你可以在几分钟内实现和测试.


Dan*_*ner 6

在每个进程级别,您可以使用GHC的RTS选项来控制最大堆栈和堆大小.