関数型プログラミング言語Haskell Part24
■ このスレッドは過去ログ倉庫に格納されています
0352デフォルトの名無しさん
2013/11/24(日) 11:41:09.78qualified Data.List as L
この2つのモジュールに共通する関数
B.foldr と L.foldr のメモリ効率に関する質問です。
f :: B.ByteString -> B.ByteString
f = B.pack . B.foldr (\b xs -> h b : xs) []
g :: B.ByteString -> B.ByteString
g = B.pack . L.foldr (\b xs -> h b : xs) [] . B.unpack
関数 f は ByteString を直接 B.foldr で加工しています。
(たとえば暗号化したり、追加のデータを挿入したり)
一方、関数 g は一度リストに変換し、それを加工しています。
このような関数を使ったプログラムをコンパイルして、
RTS オプション -s で実行してメモリ使用量を調べました。
関数 f の方は ByteString のデータサイズに比例して
メモリ使用量も増えていました。
一方、関数 g の方は、データサイズに関わらず、
ほぼ一定のメモリ使用量で処理されました。
おそらく、リストに一度変換した方は遅延処理が働いて、
一定サイズのヒープで逐次処理されたのだと思います。
ただ、そう考えると、ByteString.Lazy の遅延性は
このプログラムでは働いていないということでしょうか。
B.ByteString 型の説明には
A space-efficient representation of a Word8 vector, ...
と書かれいているのですが・・・
■ このスレッドは過去ログ倉庫に格納されています