これは、1MInt
の数字を作成してリストに入れるコードです。
main = do
let l = [1..1000000]
putStrLn $ show $ sum (foldl (\aux p -> p:aux) [] l)
(私はそれがより最適かもしれないことを知っています (sum
でfold
) しかし、私のポイントは異なります.) そして、このバージョンを見てください.
import qualified Data.ByteString.Lazy.Char8 as B
import qualified Data.ByteString.Lazy.Builder as Builder
import Data.ByteString.Lazy.Builder.ASCII
import Data.Maybe
import Data.List
main = do
let l = map (Builder.toLazyByteString . intDec ) [1..1000000]
let l2 = map (fst . fromJust . B.readInt) l
putStrLn $ show $ sum (foldl' (\aux p -> p:aux) [] l2)
このバージョンには 90MB のメモリが必要です。なんで?ここにプロファイリング出力があります
紫のエリアは?
コメントを読んだ後に編集 して、明確化を追加したいと思います。
これはテストです。メモリに 1M の数値を保持したい (ルックアップ テーブルを作成しています)。だから私は「リスト全体を強制的にメモリに保持したい」のです。しかし、バイト文字列を保持したくありません。私の小さなコードは、ディスクからバイト文字列をロードし、それを整数に変換し、整数をメモリに保持する場合のシミュレーションです。(それが私の目標です)。しかし、どういうわけかバイト文字列がメモリに残ります。なんで?