@@ -0,0 +1,32 @@
1+{-# LANGUAGE BangPatterns, OverloadedStrings #-}
2+
3+import Control.Exception
4+import Control.Monad
5+import Data.Aeson
6+import Data.Aeson.Encode
7+import Data.Aeson.Parser
8+import Data.Attoparsec
9+import Data.Time.Clock
10+import System.Environment (getArgs)
11+import System.IO
12+import qualified Data.ByteString as B
13+import qualified Data.ByteString.Lazy as L
14+
15+main = do
16+ (cnt:args) <- getArgs
17+ let count = read cnt :: Int
18+ forM_ args $ \arg -> bracket (openFile arg ReadMode) hClose $ \h -> do
19+ putStrLn $ arg ++ ":"
20+ start <- getCurrentTime
21+ let loop !n
22+ | n >= count = return ()
23+ | otherwise = {-# SCC "loop" #-} do
24+ hSeek h AbsoluteSeek 0
25+ let refill = B.hGet h 16384
26+ result <- parseWith refill json =<< refill
27+ case result of
28+ Done _ r -> L.length (encode r) `seq` loop (n+1)
29+ _ -> error $ "failed to read " ++ show arg
30+ loop 0
31+ end <- getCurrentTime
32+ putStrLn $ " " ++ show (diffUTCTime end start)