dhodovsk / source-git / ghc-aeson

Forked from source-git/ghc-aeson 4 years ago
Clone

Blame benchmarks/AesonParse.hs

Packit 9a2dfb
{-# LANGUAGE BangPatterns #-}
Packit 9a2dfb
{-# LANGUAGE OverloadedStrings #-}
Packit 9a2dfb
{-# LANGUAGE PackageImports #-}
Packit 9a2dfb
Packit 9a2dfb
module Main (main) where
Packit 9a2dfb
Packit 9a2dfb
import Prelude ()
Packit 9a2dfb
import Prelude.Compat
Packit 9a2dfb
Packit 9a2dfb
import "aeson-benchmarks" Data.Aeson
Packit 9a2dfb
import Control.Monad
Packit 9a2dfb
import Data.Attoparsec.ByteString (IResult(..), parseWith)
Packit 9a2dfb
import Data.Time.Clock
Packit 9a2dfb
import System.Environment (getArgs)
Packit 9a2dfb
import System.IO
Packit 9a2dfb
import qualified Data.ByteString as B
Packit 9a2dfb
Packit 9a2dfb
main :: IO ()
Packit 9a2dfb
main = do
Packit 9a2dfb
  (bs:cnt:args) <- getArgs
Packit 9a2dfb
  let count = read cnt :: Int
Packit 9a2dfb
      blkSize = read bs
Packit 9a2dfb
  forM_ args $ \arg -> withFile arg ReadMode $ \h -> do
Packit 9a2dfb
    putStrLn $ arg ++ ":"
Packit 9a2dfb
    start <- getCurrentTime
Packit 9a2dfb
    let loop !good !bad
Packit 9a2dfb
            | good+bad >= count = return (good, bad)
Packit 9a2dfb
            | otherwise = do
Packit 9a2dfb
          hSeek h AbsoluteSeek 0
Packit 9a2dfb
          let refill = B.hGet h blkSize
Packit 9a2dfb
          result <- parseWith refill json =<< refill
Packit 9a2dfb
          case result of
Packit 9a2dfb
            Done _ _ -> loop (good+1) bad
Packit 9a2dfb
            _        -> loop good (bad+1)
Packit 9a2dfb
    (good, _) <- loop 0 0
Packit 9a2dfb
    delta <- flip diffUTCTime start `fmap` getCurrentTime
Packit 9a2dfb
    putStrLn $ "  " ++ show good ++ " good, " ++ show delta
Packit 9a2dfb
    let rate = fromIntegral count / realToFrac delta :: Double
Packit 9a2dfb
    putStrLn $ "  " ++ show (round rate :: Int) ++ " per second"