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