ハスケルで大量のデータを読み取るのに[Char]
を使用しないことはよく知られています。 1つはByteString
を使用してジョブを実行します。 これについての通常の説明は、Char
が大きく、リストがオーバーヘッドを追加することです。[Char]ベースの入力がHaskellの[Char]ベースの出力よりもずっと遅いのはなぜですか?
しかし、これは出力に何の問題も生じないようです。最初のプログラムの出力を与えた場合
import Data.List
sum' :: [Int] -> Int
sum' = foldl' (+) 0
main = interact $ show . sum' . map read . words
は3.38秒かかります。たとえば
次のプログラム:1次ながら
main = interact $ const $ unwords $ map show $ replicate 500000 38000000
は、私のコンピュータ上で実行するだけで131ミリ秒かかります入力として!
String
を使用した入出力パフォーマンスのこのような不一致の理由は何ですか?
私のクイックプロファイリングは、入力プログラムが出力プログラムよりも13倍多くのメモリを割り当てることを示しています。これは確かに格差に寄与する。 –