私はmyConcat
、concat
の私の独自のバージョンを定義します。GHCインタプリタでスペースリークが発生するのは、concat !! nは
module Eh where
myConcat [] = []
myConcat ([]:os) = myConcat os
myConcat ((x:xs):os) = x : myConcat (xs:os)
(!!!) :: [a] -> Int -> a
xs !!! n | n < 0 = error "negative index"
[] !!! _ = error "index too large"
(x:_) !!! 0 = x
(_:xs) !!! n = xs !!! (n-1)
私はGHCインタプリタでmyConcat <some huge list> !! n
をすれば、それは300メガバイト/秒で私の記憶を盗む、と私はそれがOOMを召喚することができます前に、それを殺さなければなりませんキラー。ここでは、私はEh
を "解釈済み"として読み込みます。読み込む前にコンパイルしません。
code run in the GHC interpreter space leak? myConcat (repeat [1,2,3,4]) !! (10^8) Yes concat (repeat [1,2,3,4]) !! (10^8) No myConcat (repeat [1,2,3,4]) !!! (10^8) No concat (repeat [1,2,3,4]) !!! (10^8) No
は、今私はEh
(ghc --make -O2 Eh.hs
)をコンパイルした場合、その後、インタプリタでそれをロードし、それらのどれもスペースリーク、これらのテストを再実行します。インタプリタで実行するのではなく、各テストケースをコンパイルするのと同じです。
何が起こっているのですか?
私はGHC 6.12.3を実行しています。
ghciのどのバージョンを使用していますか?私はマシン上で4つすべてのケースで一定の記憶を持っています。私はghc '7.0.3'かそれに似ています。 – fuz
私は6.12.3を実行しています。テストをありがとう! 6.12.3は古くなっていますか? –
それほど... – fuz