on 0.9.0.0 help sign in
typeable/aeson/benchmarks/AesonParse.hs
33 lines 1.1 kB history raw
1{-# LANGUAGE BangPatterns, OverloadedStrings #-}
3import Control.Exception
4import Control.Monad
5import Data.Aeson
6import Data.Attoparsec (IResult(..), parseWith)
7import Data.Time.Clock
8import System.Environment (getArgs)
9import System.IO
10import qualified Data.ByteString as B
12main :: IO ()
13main = do
14 (bs:cnt:args) <- getArgs
15 let count = read cnt :: Int
16 blkSize = read bs
17 forM_ args $ \arg -> bracket (openFile arg ReadMode) hClose $ \h -> do
18 putStrLn $ arg ++ ":"
19 start <- getCurrentTime
20 let loop !good !bad
21 | good+bad >= count = return (good, bad)
22 | otherwise = do
23 hSeek h AbsoluteSeek 0
24 let refill = B.hGet h blkSize
25 result <- parseWith refill json =<< refill
26 case result of
27 Done _ _ -> loop (good+1) bad
28 _ -> loop good (bad+1)
29 (good, _) <- loop 0 0
30 delta <- flip diffUTCTime start `fmap` getCurrentTime
31 putStrLn $ " " ++ show good ++ " good, " ++ show delta
32 let rate = fromIntegral count / realToFrac delta :: Double
33 putStrLn $ " " ++ show (round rate :: Int) ++ " per second"