以下程序的内存分析表明,noleak 函数在常量内存中运行,而泄漏函数以线性方式泄漏内存。dflemstr 指出这可能是由于 RWST 导致了无限的分配链。是这种情况吗?还有其他解决方案吗?我实际上不需要 Writer monad。
环境:
ARCH 64 位上的 GHC 7.8.3
ghc Pipe.hs -o 管道 -prof
import Control.Concurrent (threadDelay)
import Control.Monad (forever)
import Pipes
import Control.Monad.Trans.RWS.Strict
main = leak
effectLeak :: Effect (RWST () () () IO) ()
effectLeak =
(forever $ do
liftIO . threadDelay $ 10000 * 1
yield "Space") >->
(forever $ do
text <- await
yield $ text ++ (" leak" :: String)) >->
(forever $ do
text <- await
liftIO . print $ text
)
effectNoleak :: Effect IO ()
effectNoleak =
(forever $ do
lift . threadDelay $ 10000 * 1
yield "Space") >->
(forever $ do
text <- await
yield $ text ++ (" leak" :: String)) >->
(forever $ do
text <- await
lift . print $ text
)
leak = (\e -> runRWST e () ()) . runEffect $ effectLeak
noleak = runEffect $ effectNoleak