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