ファイルの読み込み: [Char] と ByteString

Haskell での性能の話.[Char] より ByteString が速いと聞いていたが,計ってみた.3桁以下の整数が十進で各行に1つずつ書いてあるファイルで,50万行,100万行,200万行 のものを用意して,それらを全部加える計算をする,以下のプログラムを走らせてみる.(ghc -O)

import System.Environment
import qualified Data.ByteString.Lazy.Char8 as B
import Data.Maybe
import Data.List

type IFold = (Int -> Int -> Int) -> Int -> [Int] -> Int

rStr :: IFold -> IO Int
rStr f = 
 getContents >>=
 return . f (+) 0 . map read . lines

rBS :: IFold -> IO Int
rBS f =
 B.getContents >>=
 return . f (+) 0 . map (fst . fromJust. B.readInt) . B.lines

body :: [Int] -> IO Int
body (1:_) = rStr foldr
body (2:_) = rStr foldl'
body (3:_) = rBS foldr
body (4:_) = rBS foldl'
body _ = error "Usage: p1 arg, where arg is either 1, 2, 3 or 4" >> return 0

main :: IO ()
main = getArgs >>= body . map read >>= putStrLn . show

結果は以下の通り.(単位は秒)

50万行 100万行 200万行
[Char], foldr 1.124 2.234 4.418
[Char], foldl’ 1.071 2.121 4.206
ByteString, foldr 0.062 0.093 0.158
ByteString, foldl’ 0.047 0.064 0.100

参照: Haskell Cafe の記事

keywords: haskell

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*