on 1.2.2.0 help sign in
typeable/aeson/benchmarks/AesonEncode.hs
43 lines 1.3 kB history raw
1{-# LANGUAGE BangPatterns #-}
2{-# LANGUAGE OverloadedStrings #-}
4module Main (main) where
6import Prelude ()
7import Prelude.Compat
9import Control.DeepSeq
10import Control.Monad
11import Data.Aeson
12import Data.Attoparsec.ByteString (IResult(..), parseWith)
13import Data.Char (isDigit)
14import Data.Time.Clock
15import System.Environment (getArgs)
16import System.IO
17import qualified Data.ByteString as B
19main :: IO ()
20main = do
21 args0 <- getArgs
22 let (cnt,args) = case args0 of
23 (i:c:a) | all isDigit i && all isDigit c -> (c,a)
24 (c:a) -> (c,a)
25 [] -> error "Unexpected empty list"
26 let count = read cnt :: Int
27 forM_ args $ \arg -> withFile arg ReadMode $ \h -> do
28 putStrLn $ arg ++ ":"
29 let refill = B.hGet h 16384
30 result0 <- parseWith refill json =<< refill
31 r0 <- case result0 of
32 Done _ r -> return r
33 _ -> fail $ "failed to read " ++ show arg
34 start <- getCurrentTime
35 let loop !n r
36 | n >= count = return ()
37 | otherwise = {-# SCC "loop" #-}
38 rnf (encode r) `seq` loop (n+1) r
39 loop 0 r0
40 delta <- flip diffUTCTime start `fmap` getCurrentTime
41 let rate = fromIntegral count / realToFrac delta :: Double
42 putStrLn $ " " ++ cnt ++ " good, " ++ show delta
43 putStrLn $ " " ++ show (round rate :: Int) ++ " per second"