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